我发现很多程序,都喜欢在class中定义private变量,但又另外提供get,set,函数.
我认为这样写太麻烦,还不用直接定义public变量. 访问的时候直接 class实例.变量名, 请问这样做好吗?
我认为这样写太麻烦,还不用直接定义public变量. 访问的时候直接 class实例.变量名, 请问这样做好吗?
解决方案 »
- 怎么转换下面这串字符?
- 小应用程序中setLayout(new GridLayout(0,1));是什么意思?
- 我想在eclipse 里面安装 svn 用来check in /out 请问应该怎么安装?
- 【项目求助】ireport0.5.1,能做到不用附加的Scriptlet类,完全实现它内置的那些chart所有的功能吗?急切……
- sql导出dbf的一个问题,大家帮忙看看
- struts+hibernate,在Action怎样新建表?
- 急!!!在AUTOEXEC.BAT中配置环境变量重起计算机后无法进入WINDOWS系统,高手教我怎样解决,感激不尽!!100分相送!
- Toolkit.getDefaultToolkit.createImage
- 看看这个简单问题!!!!
- 有关学习java的电子图书网址
- 如何取两个已排序数组的交集?
- 如果一个类实现了两个接口,而这两个接口里边有相同名字的方法,在类里边如何定义这两个方法?
-----------------------------------------------------
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 class A {
private int numberA;
public getNumberA() {
return this.numberA;
}
public void setNumberA(int number) {
if (number > 0)
this.numberA = number;
}
}
----------------------------------------------------
Your program is protected (although very much limited in the example).You'd better read materials about OO Encapsulation to study further.
2.IDE可以帮你生成的,一点都不麻烦地!!(选中变量,右键选source-->Generate Getters and Setters...)
java的特点。。
我感觉,这主要是java的风格吧.类库里面基本上没有直接调用一个共有变量的.全都是用get/set
C#的类库里面多数都是使用共有变量来存取的.可能是因为两种语言的访问器不同的原因吧.
但是设想,你有一个Person类代表一个人,Person有一个char类型的sex字段表示性别,理论上,sex只接受两个值,'M'和'F',但如果你把sex字段设为public,你很难限制你的用户只给它赋'M'或'F'值。将sex设为private,再用setSex()来设置性别,你就完全可以控制这种行为了。
======================================
我现在只是讨论这种情况! 类似楼上说的sex 性别这种属性,当然要用set 方法来控制了.
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直接生成,并不麻烦。
我现在只是讨论这种情况!
-----------------------------------I服了U!!好,你现在只讨论这种情况。你把所有变量都设为public,然后发布了你的代码。一段时间后,你发现你该对你的变量设置做一些控制了,然后你再通知用你的代码的所有人,“同志们,请用set()和get()来访问我的变量”,估计你会被海扁的。
就像那些编码规范一样,你不遵守你的代码还是一样能用
大概明白get与set 的好处了. Dan1980() 说的有道理. 用get与set 方便以后扩展功能. 某个变量以后说不定就会要求有什么限制了,这时候我们只要修改set函数即可.
-----------------------------------
到这个境界也就不问这个问题了
oop
数据与行为相分离
=====================================================================
没错,这个是OO的基本概念。顺便说一句,在一些对面向对象支持更好的语言中,例如Ruby,数据天生就是私有的,只能通过接口方法去访问。
另外,很多IDE都支持对变量自动产生getter和setter方法,你只需要点几下鼠标,例如Eclipse.
我对这个问题的看法: 我们不能单纯地从实现的角度去考虑这个问题,因为条条大路通罗马,但肯定付出不相同的,我们应该提升我们的编程思想(这也正是程序员coder所缺泛的),楼主所说的问题是一个典型的面象对象思想中的封装性,而非java所特有,所有面象对象的语言都应该对自己的属性进行(set/get),面向对象,看什么是对象? 对象就是属性+行为,封装就是把对象的私有属性封装起来,只有通过自己公开的行为去改变(获得)对象内部的私有属性信息,而那些public的方法正是面其它对向的接口,你只有通过接口去改变(获得)对象的私有属性
规范做法其实我懂,所有写java程序的人都懂,但我们应该要思考为什么要这样做? 这样做的好处是什么? 你不去思考就成了机器人吧, 都老是跟着别人去做,那别指望能有创新思想了.
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开发出东西的时候大概已经很多年过去了.电脑上的任何问题如果一定要追到根源,只能用机器码解释.这完全没有必要.你想要的答案在将来你的应用中会慢慢了解.一个朋友的话:"程序员是熟练工种,不是技术工种."有一定道理.
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版本都可以
一概否定public形式的变量访问方式就和一概否定goto在程序编写中的出现一样可笑
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
如果只是把这个class当作一种组合的数据类型,完全可以直接使用public变量,使用get/set说明了这个class不止是储存数据这么简单,还可能进行一些操作,而这些操作会影响或使用到这个变量。
一概否定public形式的变量访问方式就和一概否定goto在程序编写中的出现一样可笑
===========================================================================
可笑吗? 许多对面向对象支持更好的语言就是这样做的.例如Ruby,实例变量都是私有的,只能通过接口方法访问。
public property String name;
public readonly property String name;
======================================
哈哈,我就是想要这种效果! 不知有些自以为自己很理解oop的人怎么看.
public property String name;
public readonly property String name;
======================================
哈哈,我就是想要这种效果! 不知有些自以为自己很理解oop的人怎么看.==========================================================搞错没有?这也不能替代setter啊。加了个只读,只写功能而已。
如果public变量毫无用处,干脆语言设计的时候取消这个特性好了,规定不能有public的成员变量,可是目前为止有这种程序设计语言吗?