java知识点整理|getter与setter的作用

【java知识点整理|getter与setter的作用】getter与setter一般不包含业务逻辑,仅仅是为类成员属性提供读取或修改的方法,为什么不直接通过实例来直接引用属性进行修改呢?有两点好处。
优点

  1. 满足面向对象语言封装的特性
    ??尽可能将类中的属性定义为private,针对属性值的访问与修改使用相应的getter、setter方法,不是直接通过对public属性进行读取修改。
  2. 有利于统一控制
    ??直接通过对public属性进行读取修改和没有业务逻辑的getter/setter效果一样,但是前者难以应对业务的变化。比如,如果业务需要对某个属性进行修改权限控制,如果有setter作为统一的属性修改方法则更容易实现,这种情况在一些使用反射的框架中作用尤其明显。比如Spring框架中,通过getter/setter获取Bena和注入Bena;Mybatis框架通过注解操作数据库时,就是通过setter将查询的值赋给pojo对象;在Java web中统一封装返回对象,json序列化时,也是通过getter获取属性值。
写法 直接以 public type getAttributeName()/ public void setAttributeName()方式写。遵循Java方法的命名规范。
class User { private String name; private Integer age; public String getName(){ return name; } public Integer getAge(){ return age; } public void setName(String name){ this.name = name; } public void setAge(Integer age){ this.age = age; } }

或者添加@Data等注解方式。通过maven导入Lombok依赖包或直接下载其jar包,再在idea中安装lombok插件(这里不详细介绍)。
//pom.xml文件中引入Lombok依赖 org.projectlombok lombok 1.16.20 >provided //在pojo类中添加@Data 注解或@Setter/@Getter注解,简化了getter/setter代码,但编译的时候会生成相应的方法。 @Data class User { private String name; private Integer age; }

注意点
  1. getter/setter中添加业务逻辑。问题出现时,程序员一般会习惯性的忽略getter/setter方法的嫌疑,这会增加排查问题难度。
  2. 同时定义isXxx()和getXxx()。在类定义中,两者同时存在会在Mybatis、json序列化等场景下引起冲突。比如Mybatis通过反射机制解析加载属性的getter方法时,首先会获取对象所有方法,然后筛选出以get和is开头的方法,并存储到类型为HashMap的getMethods变量中。其中key为属性名称,value为getter方法。因此isXxx()和getXxx()方法只能保留一个,哪个方法被后存储到getMethods变量中,就会保留哪个方法,具有一定的随机性。所以当两者定义不同时,会导致误用,产生问题。
  3. 相同的属性名容易带来歧义。在编程过程中,应该尽量避免在子父类的成员变量之间、不同代码块的局部变量之间采用完全相同的命名。虽然这样定义是合法的,但是要避免。这样使用非常容易引起混淆,在使用参数时,难以明确属性的作用域,最终难以分清到底是父类的属性还是子类的属性。对于非setter/getter的参数名也要避免与成员变量名称相同。

    推荐阅读