讨论,为什么很多人都不定义public变量? 而要另外写get,set函数来设置private变量的值

highscore2 2007-01-08 12:25:10
我发现很多程序,都喜欢在class中定义private变量,但又另外提供get,set,函数.
我认为这样写太麻烦,还不用直接定义public变量. 访问的时候直接 class实例.变量名, 请问这样做好吗?


...全文
2585 74 打赏 收藏 转发到动态 举报
写回复
用AI写文章
74 条回复
切换为时间正序
请发表友善的回复…
发表回复
icyblood198999 2012-02-21
  • 打赏
  • 举报
回复
感谢Schemer,受益匪浅!
ya654277yo 2012-01-14
  • 打赏
  • 举报
回复
有些加get set 有些不必要的不加,看实际代码逻辑,就这样,
一明惊人- 2011-12-09
  • 打赏
  • 举报
回复
如果是在Android开发,或者在内存、性能敏感的嵌入式设备上,哪个更好呢?
denbes 2007-01-11
  • 打赏
  • 举报
回复
受益匪浅
hyqryq 2007-01-09
  • 打赏
  • 举报
回复
cxzhq2002(清风) ( ) 信誉:100 Blog 2007-1-8 19:00:36 得分: 0



数据与行为相分离

=====================================================================
没错,这个是OO的基本概念。顺便说一句,在一些对面向对象支持更好的语言中,例如Ruby,数据天生就是私有的,只能通过接口方法去访问。
另外,很多IDE都支持对变量自动产生getter和setter方法,你只需要点几下鼠标,例如Eclipse.
luyang1016 2007-01-09
  • 打赏
  • 举报
回复
jf
shine333 2007-01-09
  • 打赏
  • 举报
回复




IMHO,对这种不会提升任何速度(编码get/set都自动生成、编译复杂度提升、运行速度不会有大的帮助)的东西不用也罢
hyqryq 2007-01-09
  • 打赏
  • 举报
回复
DarknessTM(我的缘分在哪里?) ( ) 信誉:100 Blog 2007-01-09 11:42:27 得分: 0


如果只是把这个class当作一种组合的数据类型,完全可以直接使用public变量,使用get/set说明了这个class不止是储存数据这么简单,还可能进行一些操作,而这些操作会影响或使用到这个变量。
一概否定public形式的变量访问方式就和一概否定goto在程序编写中的出现一样可笑
===========================================================================
可笑吗? 许多对面向对象支持更好的语言就是这样做的.例如Ruby,实例变量都是私有的,只能通过接口方法访问。
rehte 2007-01-09
  • 打赏
  • 举报
回复
告诉大家一个好消息:Java 7准备支持property了,比如:
public property String name;
public readonly property String name;
等等。
看看javalobby上的讨论:
http://www.javalobby.org/java/forums/t88090.html
这是java 7 feature预览稿:
http://blogs.sun.com/dannycoward/resource/Java7Overview_Prague_JUG.pdf
DarknessTM 2007-01-09
  • 打赏
  • 举报
回复
如果只是把这个class当作一种组合的数据类型,完全可以直接使用public变量,使用get/set说明了这个class不止是储存数据这么简单,还可能进行一些操作,而这些操作会影响或使用到这个变量。
一概否定public形式的变量访问方式就和一概否定goto在程序编写中的出现一样可笑
shine333 2007-01-09
  • 打赏
  • 举报
回复
还有,如果以“学院派”的角度,去思考问题,我们都应该用obj.foo()而不是obj.x = ...这样的方式,x是obj自己的属性,就应当由其自身维护,而不是我们来负责维护,

此外,如果从代码维护的角度obj.foo()也比obj.x好,考虑一下,假如需要对这部分功能进行改进,或者重写,写foo()调用的方式,你只需要维护一处代码或者使用override,而obj.x的方式,就需要维护N处
z_lping 2007-01-09
  • 打赏
  • 举报
回复
vitren兄弟,俺的例子是Integer Division而已。
shine333 2007-01-09
  • 打赏
  • 举报
回复
z_lping(Schemer)纠正一点.现在的java中,0可以作分母.
java 5.0中
java.lang.Double:
line:38:
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
line:45:
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
line:52:
public static final double NaN = 0.0d / 0.0;
你也可以在5.0的环境下试试sysout(10 / 0)看看输出的是什么.

=======================

since jdk 1.0,所以任何JDK版本都可以
ww_goddess 2007-01-09
  • 打赏
  • 举报
回复
其实是对于某些private型的数据,不能让随便什么类都能修改,如果某些类想修改,只有通过set方法来实现.如果程序是你一个人写的话,你不会有什么失误,但是如果是一个团队共同开发的程序,你定义了一个public,可能被别人误用,造成损失.
highscore2 2007-01-09
  • 打赏
  • 举报
回复
(其实我也不能完全弄清.但我已经看到了这么作的必要性.)
=======================================================
谢谢了,我也似乎到这个必要性了. 我希望不是一味的跟着别人做,我希望知道这样做的好处,不求全懂,至少知道部分也好,所以才问这些问题.
vitren 2007-01-09
  • 打赏
  • 举报
回复
z_lping(Schemer)纠正一点.现在的java中,0可以作分母.
java 5.0中
java.lang.Double:
line:38:
public static final double POSITIVE_INFINITY = 1.0 / 0.0;
line:45:
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
line:52:
public static final double NaN = 0.0d / 0.0;
你也可以在5.0的环境下试试sysout(10 / 0)看看输出的是什么.

以上是细节问题.

回lz.set/get方法看似只是一个规范.但规范有规范的目的.你这里没有用.但是对实力化你的类,调用你的方法/属性的类很可能是必要的.set/get方法做规范的目的其实不是那么简单.上面很多人已经说了.但是可能你现在还没有体验到.面向对象的基本思想,封装性,安全性,稳定性,可扩展性,是否便于维护等等等等.需要完全弄清楚这些不是一天的事情.也不会一个帖子的问题.(其实我也不能完全弄清.但我已经看到了这么作的必要性.)其实很多时候不需要马上弄清楚问题的根源.不然等到你能用java开发出东西的时候大概已经很多年过去了.电脑上的任何问题如果一定要追到根源,只能用机器码解释.这完全没有必要.你想要的答案在将来你的应用中会慢慢了解.

一个朋友的话:"程序员是熟练工种,不是技术工种."有一定道理.
shine333 2007-01-09
  • 打赏
  • 举报
回复
TO lz,JavaBean的规范看过了没有,我们平时用到的90%的framework/library都会用到javabean。比如JSP中用到的useBean,TagLib,Struts中用到的ActionForm、Beanutils、Degister。这些基于JavaBean的,只认get/set/isXxx(即使class里面根本就没有xxx)
highscore2 2007-01-09
  • 打赏
  • 举报
回复
有网友提出了 "数据与行为相分离" 观点,很好! 其实这观点是前人的总结, 我们跟着做不会有错,但要你说了同具体这样做有什么好处? 我想没多少人能说出来.
highscore2 2007-01-09
  • 打赏
  • 举报
回复
特别谢谢 IFindit 及 Dan1980!
规范做法其实我懂,所有写java程序的人都懂,但我们应该要思考为什么要这样做? 这样做的好处是什么? 你不去思考就成了机器人吧, 都老是跟着别人去做,那别指望能有创新思想了.
IFindit 2007-01-09
  • 打赏
  • 举报
回复
z_lping(Schemer) ,Dan1980() 两位用鲜明的实例证明了封装性的好处所在
加载更多回复(54)

62,617

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧