Java中getter和setter方法的作用

Java中getter和setter方法的作用

在Java中,gettersetter方法是面向对象编程中实现封装的核心手段,它们的作用不仅限于访问或修改对象的属性,还为代码的灵活性、安全性和可维护性提供了重要保障。以下是其核心作用的详细说明:

idea快捷键:alt加insert加enter,选择getter和setter方法即可


一、核心作用

1. 实现封装(Encapsulation)
  • 隐藏内部实现:将类的属性设为private,外部只能通过public方法(getter/setter)访问,避免直接操作属性带来的不可控风险。
  • 控制访问权限
    • 只读属性:仅提供getter方法(如id)。
    • 只写属性:仅提供setter方法(如密码修改后触发日志)。
    • 条件访问:通过方法逻辑限制访问(如管理员权限校验)。
2. 数据校验与逻辑处理
  • 输入验证:在setter中校验数据合法性。

    public void setAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("年龄不能为负数");
        }
        this.age = age;
    }
    
  • 副作用触发

    • 数据修改时自动更新缓存或通知观察者(如观察者模式)。
    • 日志记录或审计跟踪。
3. 支持计算属性与延迟加载
  • 动态计算值getter可返回计算后的值,而非直接存储。

    public int getBirthYear() {
        return Calendar.getInstance().get(Calendar.YEAR) - this.age;
    }
    
  • 延迟加载(Lazy Loading):首次访问时加载资源,减少开销。

    private List<String> data;
    
    public List<String> getData() {
        if (data == null) {
            data = loadDataFromDatabase(); // 按需加载
        }
        return data;
    }
    
4. 兼容框架与规范
  • JavaBean规范:要求属性通过getXxx()setXxx()访问,供反射工具(如Spring、Hibernate)识别。
  • 序列化控制:某些序列化库(如Jackson)依赖getter方法生成JSON字段。
5. 支持多态与继承
  • 方法重写:子类可重写getter/setter,扩展或修改行为。

    // 父类
    public class Shape {
        protected int width;
        
        public int getWidth() {
            return width;
        }
    }
    
    // 子类重写,添加单位转换
    public class Circle extends Shape {
        @Override
        public int getWidth() {
            return width * 2; // 返回直径
        }
    }
    

二、最佳实践

1. 命名规范
  • getterpublic 返回类型 get属性名()(布尔类型可用is属性名())。
  • setterpublic void set属性名(参数类型 参数)
2. 避免过度暴露
  • 仅暴露必要的属性,非必要字段无需提供公共访问方法。
  • 使用private或包级私有的setter限制修改范围。
3. 性能优化
  • 频繁调用的getter避免复杂计算,可缓存结果。
  • 线程安全场景下,使用synchronized或原子类(如AtomicInteger)。

三、示例代码

public class User {
    private String name;
    private int age;
    private String email;

    // Getter for name
    public String getName() {
        return name;
    }

    // Setter for name with validation
    public void setName(String name) {
        if (name == null || name.trim().isEmpty()) {
            throw new IllegalArgumentException("姓名不能为空");
        }
        this.name = name.trim();
    }

    // Getter for age
    public int getAge() {
        return age;
    }

    // Setter for age with validation
    public void setAge(int age) {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("年龄无效");
        }
        this.age = age;
    }

    // Read-only email (仅内部可修改)
    public String getEmail() {
        return email;
    }

    private void setEmail(String email) {
        this.email = email;
    }
}

四、总结

gettersetter是Java封装的基石,它们通过控制数据访问添加业务逻辑支持扩展性,使代码更加健壮和灵活。在设计和实现时,需根据业务需求平衡封装性与便捷性,避免暴露不必要的细节。

你可能感兴趣的:(java,开发语言)