关于getter和setter是否有必要?

在大家写java的实体类的时候,绝大部分都是private去修饰类里的属性,然后再底下写get和set方法对外界提供属性的修改和获取。如:

public class Student {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

 这样子的代码在属性少的时候还能接受,在属性多的时候,尤其是数据库表的实体或者报文的实体类动不动就会有几十个甚至上百个属性,每个属性再加上在加上俩个方法,相当于三倍的代码量。虽然现在有idea和lom插件可以省略编写这些方法的工作量,但是如此臃肿的实体类阅读起来也是灾难。

但是吧,这也是没有办法的事,有俩点原因

1:绝大部分主流框架,如数据库和json、xml报文映射框架,都是通过反射调用setter去实现实体类对象的构建。你不写的话,你写的实体类就无法使用这些框架。(好像只有spring ioc构建bean的时侯才没用到getter和setter,因为对象都是人家托管代理生成的,凭啥要调你的getter和setter)

2:如果一个实体类有100个属性,这一百个属性在俩百个地方调用,或者你写的实体类封装成jar供给其他应用使用,一旦将来需求有变更,要求你对这些属性的set加上非空判断,对这些属性的get加上日志打印。不止该实体类需要改变。调用这些属性的地方全部是用object.attr的方式去调用,则所有和该实体类有关的程序均需要调整,那工作量就无法想象了。

所以还是老老实实加上那些看似毫无意义的getter和setter把,因为它们在java里还是很重要的。

再说说javascript中的get和set,再js构建对象中,貌似从来没有对属性写过get和set呀,其实不然,再es6之前,jquery对document控件的封装,都是用函数去控制element的value值的。如:$(#id).val()和$(#id).val("111")就是对value值进行了getter和setter的封装。但是在es6和node.js推出来以后,各种前端框架vue、react横空出世。导致jquery逐渐被淘汰。而再也看不见jquery的val()了。所有js的对象属性object.attr的方式去赋值和获取的。难道js就不怕java那俩点问题吗?

主要还是es6的新特性get和set,而且js的get和set不像java是主动调用的,而是被动调用的。

let obj={
    _name:"张三",
    _age:13,
    set age(ageVal){
        this._age=ageVal
        console.log("age被修改")
        
    },
    get age(){
        console.log("age被获取")
        return this._age

    },
    set name(nameVal){
        this._name=nameVal
        console.log("name被修改")
        
    },
    get name(){
        console.log("name被获取")
        return this._name

    }
obj.name //name被获取
obj.name="李四"//name被修改 
obj.age//age被获取
obj.age=21//age被修改 


}

把想要提供给外界的调用的属性加上get 和set函数。这样在外界对该对象可以直接object.attr的调用,会自动执行getter或者setter。

这样的好处在于,进可攻退可守。如果没有特殊需求,则可以不写get和set。哪怕将来有了需求。则只需要更改对象的构建方式,而外界调用该对象的属性部分则可以完全不变。vue实现双向绑定和单项绑定也是用了es6的get和set,再属性发生变化的时候自动调用set函数去改变对应element的属性值。

再说说python,python和java一样都是oop的编程语言,但是它和javascript一样都是动态语言。则它也有类似JavaScript的特性。

class Student:
    def __init__(self):
        self.__name = None
        self.__age = None

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

    @property
    def age(self):
        print("age被获取")
        return self.__age

    @age.setter
    def age(self, age):
        print("age被改变")
        self.__age = age
if __name__ == '__main__':
    stu = Student()
    stu.age=13 #age被改变
    print(stu.age)#age被获取

如上图,Student的name用的是老传统的getter和setter。age用的@setter和@property装饰器来装饰。外界可以直接用object.attr的方式进行属性的修改和获取。再没有需求的时候可以不写get和set。有需求的时候,在单独对class进行调整。而不影响其他应用程序代码的使用。

现在来看,只有java的getter和setter是必须写的。可能也是因为它是静态语言的缘故吧。动态代理也只能做到对函数的调用的时候进行拦截来实现aop。对于属性值的修改与获取还是没有任何办法去做优化。只能等待后续jdk的更新了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Action的区别 对于有着丰富的Struts1.x开发经验的朋友来说,都十分的清楚Action是整个Struts框架的核心内容,当然Struts2也不例外。不过,Struts1.x与Struts2的Action模型很大的区别。 Struts2和Struts1.x的差别,最明显的就是Struts2是一个pull-MVC架构。这是什么意思呢?从开发者角度看,就是说需要显示给用户的数据可以直接从Action获取,而不像Struts1.x那样,必须把相应的Bean存到Page、Request或者Session才能获取。Struts1.x 必须继承org.apache.struts.action.Action或者其子类,表单数据封装在FormBean。Struts 2无须继承任何类型或实现任何接口,表单数据包含在Action,通过GetterSetter获取。 虽然,在理论上Struts2的Action无须实现任何接口或者是继承任何的类,但是,在实际编程过程,为了更加方便的实现Action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并且重载(Override)此类里的String execute()方法。如下所示: package ActionDiffer; import java.text.DateFormat; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; public class ActionForStruts2 extends ActionSupport ...{ private String message; public String getMessage() ...{ return message; } @Override public String execute() ...{ message = " This is hello from strtuts2. Now is: " + DateFormat.getInstance().format( new Date()); return SUCCESS; } } 首先,从ActionForStruts2可以看出,返回的对象不是ActionForward,而是String。如果你不喜欢以字符串的形式出现在你的代码,有个Helper接口Action可以以常量方式提供常见结果,如“success”、“none”、“error”、“input”和“login”。 另外,按照惯例,在Struts1.x只有“execute”方法能调用Action, 但在Struts2并非必要,任何声明为public String methodName() 方法,都能通过配置来调用Action。 最后,和Struts1.x最大的革命性的不同是,Struts2处理Action过程调用的方法(“execute”方法)是不带参数的。那如何获取所需要的对象呢?答案是使用IoC(反转控制,Inversion of Control),也叫“依赖注入(Dependency Injection)”的模式(想更多地了解这方面信息请看Martin Fowler的文章http://www.martinfowler.com/articles/injection.html)。Spring框架使得这个模式流行起来,然而Struts2的前身(WebWork)也同时应用上了这个模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值