在这里再问一个简单的问题,就是当我new一个对象时,它申请的空间怎么计算.比如: public class MyTest { private int a; private OtherClass c; public MyTest { this.a = 100; this.c = new OtherClass (); } public int getA () { return this.a; } public void setA (int a) { this.a = a; } public OtherClass GetC () { return this.c; } public void setC (OtherClass c) { this.c = c; } } 那么当我 new 一个 MyTest时,申请了多少内存空间呢.
To shenyouth(新晴) : 你说的这些道理我也明白,当然我不是说所有的都不用private,我的意思是不是有一些可以不用?
从实现功能上来说, public class a{ public String aa=null; } 用 a bb=new a(); bb.aa="aaaaaa"; 和public class a{ private String aa=null; public void setAa(String aa){ this.aa=aa; } 用a bb=new a(); bb.setAa("aaaaaa"); 一样可以实现的,好处都在上面说了: ) } 用
我来说点和大家观点不同的: 这是java world的一篇文章。 他的题目是:为什么get 和set方法是噩梦?楼主注意,这个并不是说你的观点是正确的,只能说你的观点是更不正确的。一下只是概要,详细信息可以登录网站查找。 Why getter and setter methods are evil ? Make your code more maintainable by avoiding accessors Summary The getter/setter idiom is a commonplace feature in many Java programs. Most of these accessor methods, however, are unnecessary and can severely impact your systems' maintainability. Using accessors violates the basic object-oriented (OO) principle of encapsulation, so you should avoid them. This article discusses getter/setter cons and offers an alternative design methodology. (3,300 words; September 5, 2003)
To linuxbing(翅膀) :
问题是我们已经给别人提供了get,set方法让别人来修改和查询,这和直接把这些月收入、身高、体重、肝的颜色....都公开有什么区别?
1. 更好的封装性。
2. 更好的维护性。
3. 更大的灵活性
使其看起来更加面向对象,而不是面向结构体,
最重要的是,getxxx()方法里有很多的处理,比如你有没有权限得到这个变量
在get和set的过程中你可以控制,譬如合法性检查啊之类的,或者控制只让set不让get或者相反,一种数据保护的手段,只允许有权限的人(public protected or private)进行受控的操作
public class MyTest {
private int a;
private OtherClass c;
public MyTest {
this.a = 100;
this.c = new OtherClass ();
}
public int getA () {
return this.a;
}
public void setA (int a) {
this.a = a;
}
public OtherClass GetC () {
return this.c;
}
public void setC (OtherClass c) {
this.c = c;
}
}
那么当我 new 一个 MyTest时,申请了多少内存空间呢.
-------------------------------------
问题是我们已经给别人提供了get,set方法让别人来修改和查询,这和直接把这些月收入、身高、体重、肝的颜色....都公开有什么区别?
-------------------------------------
区别是,以后你可以重构get/set方法,不再简单的提供对月收入等的直接访问(需要权限限制或是计算处理等等)
你说的这些道理我也明白,当然我不是说所有的都不用private,我的意思是不是有一些可以不用?
public class a{
public String aa=null;
}
用
a bb=new a();
bb.aa="aaaaaa";
和public class a{
private String aa=null;
public void setAa(String aa){
this.aa=aa;
}
用a bb=new a();
bb.setAa("aaaaaa");
一样可以实现的,好处都在上面说了: )
}
用
这是java world的一篇文章。
他的题目是:为什么get 和set方法是噩梦?楼主注意,这个并不是说你的观点是正确的,只能说你的观点是更不正确的。一下只是概要,详细信息可以登录网站查找。
Why getter and setter methods are evil ?
Make your code more maintainable by avoiding accessors Summary
The getter/setter idiom is a commonplace feature in many Java programs. Most of these accessor methods, however, are unnecessary and can severely impact your systems' maintainability. Using accessors violates the basic object-oriented (OO) principle of encapsulation, so you should avoid them. This article discusses getter/setter cons and offers an alternative design methodology. (3,300 words; September 5, 2003)
但后来逐渐就知道了
private变量之所以加上setter和getter是不让对象直接调用和修改,这样做的第一个好处就是容易以后的维护
你的疑问是提供了这样的方法还不如直接修饰为public,那样还节省开支!
不知道楼主有没有注意过,好的oo代码可不只是像这样的:
private String str;
public String getString() {
return str;
}
public void setString(String str) {
this.str=str;
}
这样的代码完全可以由public变量来取代
而设计这种模式的初衷是这样的:
private String str;
public String getString() {
if(str==null&&str.equals("someString"))
return null;
return str;
}
public void setString(String str) {
if(str==null&&str.equals("someString"))
return;
this.str=str;
}
这段代码只是示意,也就说在使用setter和getter的时候可以控制对变量的操作,这样和直接取值和设值是完全不一样的,也就实现了封装的目的了
这是我个人的了理解,请大家指正。
http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html?
我考虑到的还有当增加大量的get,set方法那么new这个对象时,相应的会增加性能开销.
我刚才提到的如何计算"new 一个 MyTest时,申请了多少内存空间",怎么没人响应:)
下面方法,楼主参考一下
Runtime.getRuntime().maxMemory();
Runtime.getRuntime().freeMemory();
jvm的内存使用情况
应该可以计算出来吧,我的考虑是:
一个对象的内存 = attribute + method的和
在java里这个应该是不随着硬件的改变而改变的.
一个int是4k,一个类在没有new以前应该是一个指针的空间是不是2k?
至于method使用内存空间的计算还是留给大家来回答了.
不止这些,还有大约是四个byte的类信息。
在get和set的过程中你可以控制,譬如合法性检查啊之类的,或者控制只让set不让get或者相反,一种数据保护的手段,只允许有权限的人(public protected or private)进行受控的操
我们应该灵活一点的,如果用public完全可以实现需求,那就不用private
楼主是不是考虑得太多了
估计一个类对象使用多少内存空间一般是不准的?这话怎么讲.