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依赖
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
    <scope>provided</scope>
</dependency>

//在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的参数名也要避免与成员变量名称相同。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值