2017/1/5
描述
一个字段被认为是私有的, 那么外部就不能访问它( 最多提供getter )
如果一个私有的字段提供了getter和setter, 那么它就被认为是公开的, 那就前后矛盾了, 应该使用 public
目的是什么
1. 一直不重视这个问题的「why」, 而只关注 how, 导致东西理解不透彻
2. anyway, 我甚至想弄清楚 what, 以刷新三观
相关代码
public class Bicycle {
private int cadence;
private int gear;
// 比如speed被认为是公开的
// 所以改成 public 的
// 然后移除对应的 getter setter
private int speed;
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
public int getCadence() {
return cadence;
}
public void setCadence(int newValue) {
cadence = newValue;
}
public int getGear() {
return gear;
}
public void setGear(int newValue) {
gear = newValue;
}
public int getSpeed() {
return speed;
}
public void applyBrake(int decrement) {
speed -= decrement;
}
public void speedUp(int increment) {
speed += increment;
}
}
上下文环境
产品版本: Java 8
尝试解决
我自己的理解
如果定义为 public 的, 那么日后要改这个字段就不容易, 而函数的「可修改性」就很强 ( 姑且称 method 为函数 )
但是真的要为以后想那么多吗( 代码是需要不断重构的, 预先空想可能是 over-design )
update:
一个python的例子, 怎么说呢, 总感觉python的这种写法舒服点( 虽然定义的时候, 代码没有比java少多少, 但是调用的时候舒服点 )
In [1]: class MyClass(object):
...: def __init__(self, name, age, gender):
...: self._name = name
...: self._age = age
...: self._gender = gender
...: @property
...: def name(self):
...: return self._name
...: @name.setter
...: def name(self, value):
...: self._name = value.strip()
...:
In [2]: c = MyClass('hezhiming', 22, 'male')
In [3]: c
Out[3]: <__main__.MyClass at 0x7febf5e59c10>
In [4]: c.name
Out[4]: 'hezhiming'
In [5]: c.name = ' hezhiming '
In [6]: c.name
Out[6]: 'hezhiming'
呃,通过方法去操作其实有很多事情可以干,尤其在配合了OO思想的情况下——类型是一个重要信息。
另外,这是一种标准,Java Bean就是这么一回事,许多框架、第三方库(最著名的就是Spring)的“正常运作”也依赖于此。你可以搜索一下“Java 帝国之Java bean”相关的文章。
强烈反对关于Setter写逻辑之类的答案。这样的代码极具误导性,有经验的人都知道不可以把逻辑写到
"bean"
层(一般对应Model层),起码要写到Service层(按照常见的三层式架构)。故此,这个情况下的Setter并不是显得那么重要了。综上,答的关于Setter里写逻辑的,都是不正确的。最后评价一下那个说存在即合理的人,希望他能去好好理解一下“存在即合理”究竟是什么意思。
正式回应一下踩我的那些人————其中就不乏泛着说Setter里写逻辑的人,也有靠着“歪理邪说”来说服别人的人。
说个故事吧,我一年前刚来社区的时候。曾看见过一个分数比较高的大神签名版上写着垃圾SF!,我注意到了他的声望记录(那时声望记录和GitHub的提交记录有点相似,不过不是记录1年这么长),几乎所有问题都被踩了一遍,很显然——这是恶意的。
在混迹社区一年多以来,我偶尔也会碰到这样的情况。不过手段并没有这么恶劣,同样,我承认我还是很菜的,对于有些问题吃不准,指不定就是误人子弟,挨踩就挨踩吧!
而今这个情况,是令我无法忍受的——错了就是错了,还要去误导别人。如果别人面试因为这种如此初级的题失利而被筛掉,那是多么的可惜啊!
最后,我想告诉 all:
我不会因为被踩了而退出社区,哪怕是恶意踩。因为我还要去回答更多的问题,防止更多的新手被“可怕的初学者”误导。同样,为了维护社区的质量,我对极具误导性的回答也决不会放过。
如果不信我的话,请在面试的时候告诉面试官你经常在Java Bean的Setter里写逻辑吧!
刚才我仔细的扫了一遍全部的答案,幸好有@kevinz 这样的用户在,我为他顶了一票,防止“可怕的初学者”将他摁下去。
回答+1分,跟风回答也才就1分。被踩就是2分。而且这样的答案越来越多,社区的质量就越来越差,届时,就算你有1W的声望,在你聊天 or 交流的时候骄傲的说了出来,别人也只会嗤之以鼻:那个社区的质量并不高,都是灌水跟风的。