JavaBean的get、set方法引发的讨论

来源:互联网 发布:淘宝自动软件是真的吗 编辑:程序博客网 时间:2024/05/17 22:12

   get set方法的使用,我们已经很熟悉了。甚至有点太熟悉,于是理所当然的用,也没认真考虑过为什么要用它。最近在set的时候,写了这样一个方法

private java.util.List<OscKepler> out;public  List getOutput(){  return this.out; }public  void setOutput(OscKepler t){   this.out.add(t);}
结果发现不对,原来set方法的参数必须和生命的变量是一样的,比如上面需要是下面:

public  void setOutput(List<OscKepler> t){   this.out= t;}
关于get,set方法的意义参考以下贴子:

转自http://kennethf6986.iteye.com/blog/828179  

一日,一个兄弟发了一个被大家广泛认为蛋疼的帖子,如下: 

Java代码  收藏代码
  1. {       
  2.     private String code;   //设置成私有变量,有什么鸟用? 难道是为了整个团队配合的时候告诉那些人这个变量不可以动吗? 那是不是一个开发一个项目的时候 这些 修饰符 是毫无意义的?     
  3.     
  4.     public void setCode(String code){       
  5.        this.code=code;       
  6.     }      
  7. }  


为什么要写一个方法去给变量赋值? 
不能直接吧code变量设置成public 用 obj.code 去赋值吗? 搞不懂,是瞎折腾吗? 
引发以下的精彩回帖。话说本帖被评为精华贴,其实是回帖里头有精华。 

同学一 
这是java的风俗。就好比所有人都在放屁之前脱裤子的社会里,你不脱就是新手。 
实际情况确实多数getter/setter都是没有用的。 
以OO流派的说法,对象的状态都因该是私有的,对象之间只有message,这就是这个风俗的理论基础。 

同学二 
1.懂OOP的程序员,会告诉你,这样做为了封装.. 
2.做过3-5年Java企业项目的人,并被客户需求虐待过的同学会告诉你,这样做为了程序易于修改、维护 
3.懂模式设计的合格程序员,会告诉你,这样写能扩展成观察者模式,备忘录模式。。。 
4.做过架构设计的牛人,会告诉你,一切为了卸耦.. 

同学三 
很简单,当你有一天需要加入一下条件或者钩子操作的时候你就知道好处啦。 

比如现在你写成public的,所有的地方都直接访问,有一天,你需要在这个属性改变的时候做一些观察者的操作,比如发邮件通知,或者其他操作的时候你就杯具啦,你必须在工程中search到底多少地方调用过,并且在每个后面去加上一段sendEmailIfChange(userid,contents)代码,但是如果是封装了,就直接在set里面判断ifChange然后改了。 
哪个好,你懂的。 

同学四 
private 恰恰告诉你,这段代码可以方便的修改,而不是麻烦的修改。 
假如你没用settter,gettter. 
案列1:系统要求所有对code:String设置值的时候需要记录日志。你原来的代码都是这个样子的: 
code = "SomeCode..."; 
你可能必须得在每处出现此语句的前面加上Log.in(code);有没有想过如果那段代码不是你写的,你没有动那段代码的权限,又或者代码已经通过jar包封成库,发布给客户使用,你咋办? 
如果用setter,情形如下: 
Java代码  收藏代码
  1. public void setCode(String code)     
  2. {     
  3.     Log.in(code);     
  4.     this.code=code;         
  5. }     


同学五 
封装:任何类成员变量都不应该被外部直接访问(且不说Javabean规范本身就是这样) 

同学六 

使用 80% 的冗余代码来解决 20% 不一定出现的问题 


0 0