读书人

议论为什么很多人都不定义public变量

发布时间: 2011-12-11 23:19:43 作者: rapoo

讨论,为什么很多人都不定义public变量? 而要另外写get,set函数来设置private变量的值
我发现很多程序,都喜欢在class中定义private变量,但又另外提供get,set,函数.
我认为这样写太麻烦,还不用直接定义public变量. 访问的时候直接 class实例.变量名, 请问这样做好吗?




[解决办法]
通过bean方法来改变变量的值比较安全,这样你可以很方便的知道这个值在什么地方被改变了。而且在改变的时候加上其他处理,如print也方便

[解决办法]
这就是JAVA的特点之一.封装!
[解决办法]
你觉得怎么样好就怎么用,有时候一个问题不理解的话可以按自己的思路走,可是代价也要自己承受,不能让公司给你交纳太多的培养费用
[解决办法]
这样不好,楼主需要查一下JavaBean,而且,这样getX/setX其实不麻烦,可以用IDE自动生成,100个也就几秒钟
[解决办法]
Give you an example. Let 's say you have class A and B as follows.
-----------------------------------------------------
public class A {
public int numberA;
}

public class B {
public A a;
public int numberB;

public B() {
a = new A();
numberB = 0;
}

public int someMethod() {
return numberB / a.numberA;
}
}
------------------------------------------

Then someone else is using your compiled class files.
-----------------------------------------------------
public class C {
public static void main(String[] args) {
B b = new B();
b.numberB = 10;
b.a.numberA = 0;
b.someMethod();
}
}
-------------------------------------------

Then this guy complain that your program has problems. What can you do?
[解决办法]
安全性和编码规范
[解决办法]
定义了Public变量,就跟让你把钱拿出来放到大家面前,---想怎么花就怎么花
[解决办法]
规范化, 一些组件调用时会通过设置器(setXXX) 来设定变量值.
[解决办法]
1.这个是有好处地,虽然好处说不太清楚;(但是,请乖乖的照做~听姐姐话,有糖吃:P)
2.IDE可以帮你生成的,一点都不麻烦地!!(选中变量,右键选source--> Generate Getters and Setters...)
[解决办法]
封装特性。。
java的特点。。
[解决办法]
大家都说封装,
我感觉,这主要是java的风格吧.类库里面基本上没有直接调用一个共有变量的.全都是用get/set
C#的类库里面多数都是使用共有变量来存取的.可能是因为两种语言的访问器不同的原因吧.
[解决办法]
应该是差不多,只是规范性的问题.
[解决办法]
1.0的时候,很多都是public,后来sun都改成了get,set
[解决办法]
get()和set()看你怎么用了,如果里面只放一个赋值语句的话,是和public变量没什么区别。
但是设想,你有一个Person类代表一个人,Person有一个char类型的sex字段表示性别,理论上,sex只接受两个值, 'M '和 'F ',但如果你把sex字段设为public,你很难限制你的用户只给它赋 'M '或 'F '值。将sex设为private,再用setSex()来设置性别,你就完全可以控制这种行为了。
[解决办法]
看一下这个情况吧。
class A
{
public string sex;
}
class B
{
private string sex;
public string getSex(){return this.sex};
public void setSex(string sex)
{
if(sex.equals( "man ") || sex.equals( "female "))
this.sex=sex;
else


throw new Exception();
};
}

在使用getX setX的时候,我们可以对设置的值进行进一步的判断,如果直接使用public 就不可以进行这样的安全性控制。
别外有一点属性我们可能并不希望其他用户对我们的属性进行写操作,这个时候,可以直接不写setX方法。这就是只读属性了。
同样用public也是无法做到的。

最后setX getX是JavaBean的规范,有很多框架(如spring hibernate 等)都是通过getX setX来对属性进行访问。

一般情况下getX setX都可以通过IDE直接生成,并不麻烦。

[解决办法]
也不一定都要用到get,set方法了,你可以只取其中之一或者都不要也可以,但是不建议直接用public 变量来访问,不够安全,而且也最好养成好的习惯
就像那些编码规范一样,你不遵守你的代码还是一样能用
[解决办法]
数据与行为相分离
[解决办法]
楼主的问题特别好, 楼主的固执其实进一步引导大家更加深入地去思考这样一个看似简单而且大家都在按照做一个问题,我想肯定有许多人不能立马回答出楼主的问题的实质,回答之前都进行了思考,思考就是在学习在进步.....大家应该感谢楼主
我对这个问题的看法: 我们不能单纯地从实现的角度去考虑这个问题,因为条条大路通罗马,但肯定付出不相同的,我们应该提升我们的编程思想(这也正是程序员coder所缺泛的),楼主所说的问题是一个典型的面象对象思想中的封装性,而非java所特有,所有面象对象的语言都应该对自己的属性进行(set/get),面向对象,看什么是对象? 对象就是属性+行为,封装就是把对象的私有属性封装起来,只有通过自己公开的行为去改变(获得)对象内部的私有属性信息,而那些public的方法正是面其它对向的接口,你只有通过接口去改变(获得)对象的私有属性
[解决办法]
TO lz,JavaBean的规范看过了没有,我们平时用到的90%的framework/library都会用到javabean。比如JSP中用到的useBean,TagLib,Struts中用到的ActionForm、Beanutils、Degister。这些基于JavaBean的,只认get/set/isXxx(即使class里面根本就没有xxx)

[解决办法]
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开发出东西的时候大概已经很多年过去了.电脑上的任何问题如果一定要追到根源,只能用机器码解释.这完全没有必要.你想要的答案在将来你的应用中会慢慢了解.

一个朋友的话: "程序员是熟练工种,不是技术工种. "有一定道理.
[解决办法]
其实是对于某些private型的数据,不能让随便什么类都能修改,如果某些类想修改,只有通过set方法来实现.如果程序是你一个人写的话,你不会有什么失误,但是如果是一个团队共同开发的程序,你定义了一个public,可能被别人误用,造成损失.
[解决办法]
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版本都可以
[解决办法]
还有,如果以“学院派”的角度,去思考问题,我们都应该用obj.foo()而不是obj.x = ...这样的方式,x是obj自己的属性,就应当由其自身维护,而不是我们来负责维护,

此外,如果从代码维护的角度obj.foo()也比obj.x好,考虑一下,假如需要对这部分功能进行改进,或者重写,写foo()调用的方式,你只需要维护一处代码或者使用override,而obj.x的方式,就需要维护N处
[解决办法]
告诉大家一个好消息: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

读书人网 >J2SE开发

热点推荐