L*********s 发帖数: 3063 | 1 如果setter只是用来给属性赋值,那么确实没必要弄setter和getter,
但是随着业务逻辑的发展,或者设计的变动,
往往我们要求在给属性赋值的同时还要干一些其他事情。
也许你辛辛苦苦写下了一百多行给某个public属性赋值的语句后,
忽然你的manager或客户要求你在给那个属性赋值的同时一定要synchronized()什么东
西,
这时你就必须在每个赋值的地方进行改动。
如果你当初只用setter,那么只要修改一下setter就可以了。
同时为了让你的合作者们使用这个类时也只用setter,就得把属性设为private,
然后就读数值就得用getter.
也许哪天你的客户要求关于这个属性的transaction都跟某个新建的网页同步,
或者要求跟某个新建的数据库同步,或者要求这个属性的值一旦变化便立即触发某个新
定义的事件。
这时你就必须添加无数的代码。
如果你当初用了getter和setter,事情就超级简单了, 基本不用改代码! 只需用鼠标设置
javabean, 然后所有的脏活累活container都自动帮你解决. |
|
|
c*****m 发帖数: 1160 | 3
我是这个意思,根据单一功能、明确名字的规范,getter和setter应该只处理一个变量
;如果需要增加逻辑在里面,就应该是另一个函数了。
如果我在debug过程中看到一个setter里面顺便修改了另外的值,那么我就需要跟踪所
有的getter/setter来确定是否还有类似的动作,很揪心的。
我所觉得getter/setter有用的地方就是做只读变量或者只写变量的时候。 |
|
g*****g 发帖数: 34805 | 4 getter setter is a java bean spec. Many frameworks rely on it to do
reflection. You have to assume the method name or you can't find it. Thus in
java, you have to call it that way. Nothing wrong to introduce extra logic
in setter to keep the object state consistent. setter is meant to change a
state of one variable. What if another variable is dependent on this
variable? |
|
发帖数: 1 | 5 01 class Test1:
02 def __init__(self, x):
03 self.x=x
04 @property
05 def x(self):
06 return self.__x
07 @x.setter
08 def x(self, x):
09 self.__x=x
10 t=Test1(10)
11 t.__x=20
12 print(t.x)
13 print(t.__x)
14
15 class Test2:
16 def __init__(self, x):
17 self.__x=x
18 @property
19 def x(self):
20 return self.__x
21 @x.setter
22 def x(self, x):
23 self.__x=x
24 t=Test2(10)
25 t.__x=20
26... 阅读全帖 |
|
m*****g 发帖数: 54 | 6 a better version
class Planet:
def getter(self):
return self.__diameter
def setter(self, value):
self.__diameter = value
diameter = property(getter, setter)
instance = Planet()
print(Planet.diameter) # call getter
instance.diameter = 1000 # cal setter |
|
|
d**********x 发帖数: 4083 | 8 Even for pure storage classes which never change it is still important to
use setter/getters for a more practical reason: debug.
if you simple use direct access, no logs can be printed and no break point
can be inserted for all of the acesses to the value -- in small projects you
can simple refactor to setter/getters, but in large project there will be
no practical way to do so.
Now
affected. |
|
p**o 发帖数: 3409 | 9 在灵活一些的动态语言比如python里,推荐的做法是直接修改类成员属性,如果哪天需
求复杂化了,再通过@property修饰一层实现更复杂的封装,但是客户代码完全不必改
动,没有“必须在每个赋值的地方进行改动”这个问题。在Java里常写getters/
setters大概是Java语言本身的限制。我不太清楚其他的静态编译语言的最佳实践里是
否包含getters/setters。 |
|
i*****f 发帖数: 578 | 10 class Planet:
@property
def diameter(self):
# a getter
return self.__diameter
@diameter.setter
def diameter(self, diameter):
# a setter
if diameter<0:
raise ValueError("impossible")
self.__diameter = diameter
def __init__(self, diameter):
self.diameter = diameter
mars = Planet(100)
print mars.diameter
mars.diameter = -10 # ValueError |
|
c*****m 发帖数: 1160 | 11
with
that
这两年经常看到一些class里面有这样的getter和setter,有什么好处?直接把这个变
量public出来不就可以了么?
相信是gof里面的一个设计模式,但是我看过几次都没有理解。 |
|
g*****g 发帖数: 34805 | 12 This is the encapsulation principle in OOP. It looks verbose, but when you
change the implementation, you can keep the contract intact.
e.g. You may introduce another variable that's directly linked to this
variable, you are supposed to update these two values at the same time. Now
you can update that variable in the setter and all callers won't be affected.
When you are making public APIs, or modulized a big system. These patterns
to help decoupling are important. |
|
c*********e 发帖数: 16335 | 13 oop原则之一,变量都是private的,不能直接动。要动,只能通过setter来改变。 |
|
c*****m 发帖数: 1160 | 14 zhaoce073 说可以在getter/setter里加入更多的process
goodbug说可以顺便管理其他变量
devilphoenix说方便debug
前两个理由是否违反“单一功能”的要求?比如md5计算,应该是另一个函数,而不是
getter了。如果顺便管理另一个函数,那么function名字就不应该是SetThisVariable(
),而应该是SetThisVariableAndAnotherVariable().
我觉得不超过 1/10的变量需要有这方面的需求;对于其他 9/10的变量就是verbose,
看起来不爽,当然也没有坏处。
you |
|
c*****m 发帖数: 1160 | 15
联结里的那个例子,用getter/setter完全没有好处啊。直接public出来不就行了? |
|
g*****g 发帖数: 34805 | 16 另外一个变量可以是个private变量。比如有个变量a,为了方便或者效率,你有个另一
变量永远是2*a.
没有setter怎么弄?
设计模式不是讲究概率,目的就是为了decoupling。内部API随便写写还没事反正可以
refactor。一旦第三方要调用,你这么弄,一旦需要改,第三方都得跟着改代码。很多
时候这是不能接受的。
SetThisVariable( |
|
d****i 发帖数: 4809 | 17 学过C++的人应该十分明白这个道理,这个正是C++要求封装的原因。Java的setter和
getter和C++的数据封装原理是一样的。 |
|
d*****b 发帖数: 9 | 18 "也许你辛辛苦苦写下了一百多行给某个public属性赋值的语句后,
忽然你的manager或客户要求你在给那个属性赋值的同时一定要synchronized()什么东
西,这时你就必须在每个赋值的地方进行改动。"
这个概率对于大多数人来说也太低了吧...要是因此给每一个public属性都加上setter
和getter,是否感觉有点儿累.
该不该加,我认为还是应该具体问题具体分析. |
|
a9 发帖数: 21638 | 19 我比较货币于用public变量,需要重构的时候用IDE改成get set很方便。
setter |
|
z*******3 发帖数: 13709 | 20 并发需要synchronized的地方会低?
随便一个server都会遇到类似的问题啊
难倒有server是单线程的?
setter |
|
d*****b 发帖数: 9 | 21 抱歉.刚才没看出你是用反问的语句形式举个新例子.不过显然你的例子更常见.
基本上我的理解就是:当你给那个属性赋值的同时还一定要干点儿其它事时,用setter把
它们放一块.没这需要时就别用. |
|
a9 发帖数: 21638 | 22 可能咱们做的业务不同,我这儿基本上用同步很少,需要有同步的地方,基本都需要数
据库锁来实现。因为只要同步,就不只是一台服务器上同步,所有的服务器都需要保持
同步。
setter把 |
|
g*****g 发帖数: 34805 | 23 我老看看板上的帖子还算有依据。总比你靠谱多了,难道你还能统计了大多数学Java的?
发信人: moneybull (moneybull), 信区: Programming
标 题: Re: 为什么java要用setter和getter
发信站: BBS 未名空间站 (Tue Dec 18 09:56:11 2012, 美东)
大部分学Java的都是知其然而不知其所以然
学C++的,如果不知其所以然,很难混下去... |
|
y*******g 发帖数: 6599 | 24 java 不用getter/setter直接access 的话是静态绑定的。不太方便 |
|
d******e 发帖数: 2265 | 25 不是evil是stupid.
这是当年m$当道,软件升级会遇到的困难。
现在早就不需要了。特别是函数 1st citizen 加上immuatable class后,更佳不需要
考虑getter/setter
methods. |
|
i*****f 发帖数: 578 | 26 Looks somewhat weired compared to other language setter/getter |
|
g*****g 发帖数: 34805 | 27 对一个简单独立纯setter/getter的property来说,跟public member
并没有什么不同。问题在于未来不可预期。对于一个外部类来说,不做
encapsulation将来存在重构的风险。举两个简单的例子。
1. 你有一个String。你某天发现这个String有时候有white space需要trim。
用setter/getter,没有问题,可以在setter里面trim了。所有外部调用
setter/getter的类都不需要改动。反之,当你直接用public member的时候,
你要吗在所有引用的地方trim,要吗重新回到setter/getter。无论哪种
做法你改变的都是N个类,而不是一个。如果这是公共API,有不受你控制的
第三方的源码调用这个类,你直接就破坏了接口。
2. 你有两个变量a 和b,刚开始独立,后来突然来个要求a必须是b的2倍。
有getter/setter,不是问题。没有,结果可以想见。
一些函数语言如Scala,可以做到成员和函数的外部调用在语法上没有区别,
未来重构不是问题,这是其可以把成员确省成public的原因。我不知道C#
现在... 阅读全帖 |
|
|
p*u 发帖数: 2454 | 29
anywhere by
setter/
you are right, but we can always solve this with another level of
indirection:
"
#define GETTER( a ) Intruder::get( *this, a )
#define SETTER( a, i ) Intruder::set( *this, a, i )
class A
{
private:
friend struct Intruder;
int _i;
};
struct Intruder
{
template
static int get( const T& ref, const A& a );
template
static void set( const T& ref, A& a, int i );
};
template
int Intruder::get( const T& ref, const A& a )... 阅读全帖 |
|
E***y 发帖数: 336 | 30 我倒是没兴趣当setter,
但是我得知道什么类型的,可以和setter交流,提要求,检查他们的工作。
setter国内工资还可以呀,三线城市是3000多不到四千的样子,
估计北上广能接近五六千,水平高的得一万吧。 |
|
d*g 发帖数: 16592 | 31 Here are 2 (well thought IMO) posts from Veroniquem on the topic.
Quote:
Originally Posted by veroniquem
I looked into it. Let's kill those silly accusations once and for all.
This is a complete list of Djoko's retirements in his career. Here we go:
2003: Serbia F5
2004: none
2005: RG
2006: RG, Umag
2007: W
2008: DC 1st R, M-C
2009: AO
2010: Belgrade
2011: Cincy, DC Semi
2012: none
Myth #1: Djoko used to be a serial retirer: false: he's never retired more
than once or twice a year out of a full... 阅读全帖 |
|
z**o 发帖数: 40 | 32 First article I googled with "volleyball 4-2"
Learning the 4-2
Choosing line-ups are one of the coaches toughest jobs.
The coach must have a strong knowledge of the three major line-ups, as well as
the teams abilities and strengths. The 4-2, one of the most basic formations,
is often used at the lower levels and most effective if a team does not have a
good arsenal of hitters.
The line-up is basic: two setters and four hitters. Unlike the 6-2, where
there are also two setters, but the setter |
|
C******n 发帖数: 941 | 33 3-meter line
n. the attack line.
31X
n. a series of plays in which the middle attacks the three (31) and the left
crosses, fake-crosses, or flairs from the three-hitter.
51X
n. a series of plays in which the middle attacks the one (51) and the right
crosses, fake-crosses, or flairs from the one-hitter.
4-2
n. an offense with four spikers and two setters. The setters are setters when
they are in the front row, and defenders when they are in the back row.
5-1
n. an offense with five spikers and on |
|
s******u 发帖数: 60 | 34 来自主题: VolleyBall版 - Today two keys to be successful:
1. good passing, which is always good for whatever you want to do
2. watch the return serves and run along with the setter
plus practice, and more practice, especially with the setter.
yes, understanding transition is important for middle blocker.
You have to stay at the net at all times, and head back to 10 feet
line and ready for attack when the ball is on your side. It will
take some time to get used to.
as
setter
that
fun.. |
|
m********r 发帖数: 299 | 35 防守时两人之间的球喊mine/yours或I go/you go
靠近边界的球可以帮队友喊in/out,因为接球的人自己有时不好判断
进攻时你要什么球也可以喊:5/4/3/2/1/slides/cross......
后排的有A/B/C/D/pipe
队友进攻你可以告诉他有几个拦网的(no one/one up/two up...),或者告诉他哪里有
空档:直线喊line,斜线喊angle或cross(大斜线deep angle, 小斜线hard angle),心是
空的的话也可以喊donut,队友后排进攻时帮他看三米线,没踩上喊clear这样他可以放
心打,踩上了喊no这样他会把球处理过去
拦网时,看两边各一个hitter喊two hitter split,setter前排时喊setter's up这样
会有人盯住setter二次球,对方扣球出界时,你要是手摸到了要喊touch,这样崩出去
的球队友会去追,没碰到喊no这样后排防守的就不碰了
然后别人打的好了鼓励一下:nice hit/set/dig,失误了安慰一下it's OK/shake it off
,打球吗就是为了大家开心吗: |
|
s*******d 发帖数: 126 | 36 people tend to call "free" whenever there is a high ball passing over from
the other side, as if it is freely given by the opponents. Well, this is a
mis-use of the word. Only the setter, and only when the setter is rotated to
the backrow, can call "free". Because it is served as a reminder to the
rest of the team that the setter has "freed" themselves from their devensive
position and that the rest of the team should adjust and cover the vacated
position accordingly.
So when you play, if you ar |
|
a******u 发帖数: 317 | 37 our typical "free" ball training is that the middle blocker, outside hitter,
right-side will retreat from the net, in the service receive position.
if free ball is given to setter who is in back row, setter will call "
setter is out". the right-side hitter will set the ball.
so mostly it is a signal for front row people, 'no blocking, retreat from
the net, prepare for attacking.'
to
devensive
vacated
the
,
your |
|
z*******3 发帖数: 13709 | 38 之前说过我对abstract class的看法,倒是引来不少非议
尤其是有些人居然举出了例子,好,我们就从这个例子开始
有人说在这种情况下要使用abstract class
比如一个animal,有walk和sing方法
那么代码就是
public abstract class Animal{
public void walk(){System.out.println("walk")};
public abstract void sing();
}
然后对于具体的实现类,比如Cat,有如下实现
public class Cat extends Animal{
public void sing(){
System.out.println("cat sing");
}
}
这样一个类,好处就是“便于扩展”等等
OK,那么我们就从这个例子出发,说说为什么在j2ee环境中,我们不这么做
然后说说会怎么做
首先,在j2ee的环境中,关于animal这种实体
我们会在各个层面建立entity
比如在db层面建立一个表,叫做animal,然后有一个cat记录
然后通过orm,建立起一个dto之类的玩... 阅读全帖 |
|
z*******3 发帖数: 13709 | 39 之前说过我对abstract class的看法,倒是引来不少非议
尤其是有些人居然举出了例子,好,我们就从这个例子开始
有人说在这种情况下要使用abstract class
比如一个animal,有walk和sing方法
那么代码就是
public abstract class Animal{
public void walk(){System.out.println("walk")};
public abstract void sing();
}
然后对于具体的实现类,比如Cat,有如下实现
public class Cat extends Animal{
public void sing(){
System.out.println("cat sing");
}
}
这样一个类,好处就是“便于扩展”等等
OK,那么我们就从这个例子出发,说说为什么在j2ee环境中,我们不这么做
然后说说会怎么做
首先,在j2ee的环境中,关于animal这种实体
我们会在各个层面建立entity
比如在db层面建立一个表,叫做animal,然后有一个cat记录
然后通过orm,建立起一个dto之类的玩... 阅读全帖 |
|
d****p 发帖数: 685 | 40 This doesn't solve the problem: the getter/setter can be called anywhere by
anybody in the following form:
a.getter(B())
The solution is however good in the sense that it creates syntax
inconvenience for accessing A's member variables from Non-B classes.
The argument of setter/getter has to be lvalue and the return of setter/
getter has to be injected to the consumer object. |
|
g*****g 发帖数: 34805 | 41 我跟你说了最重要的好处是可以维护内部state的一致,外部调用者不用修改接口。你
如果不理解可以去读为什么要encapsulation。
你问我为什么叫setter,而不叫updater,我才告诉你这是java的convention。换一种
语言也许不叫setter,只要是convention,也是可以的。Java用setter因为这是java
bean的spec。reflection会自动找这样的方法。 |
|
l****z 发帖数: 29846 | 42 by Bruce N. Eimer, Ph.D
The question is often asked, “what is the best handgun for concealed carry?
” There are many valid answers to this question and they usually begin with
, “well, it depends on a number of factors.” However, in my humble opinion
, there is one universally valid answer, and that is, “it is the gun that
you have on you when you need it.” With that said, the purpose of this
brief article is to make you aware of twelve handguns that are so easy to
carry, that there is no excuse... 阅读全帖 |
|
a****n 发帖数: 1887 | 43 这个不是语法的问题,是OOP概念上的问题, class 本身应该有高内聚/低耦合,
简单的例子, 比如Rectangle的面积, 一般create一个Rectangle的object,
1. setWidth, setHeight, 然后 double area = object.getArea()。
2. setWidth, setHeight, 然后 double area = object.getWidth() * object.
getHeight();
第二种方法内聚比第一种低很多. 一般在设计class 的时候更多的考虑他的behavior,
设计class 有个基本原则tell, don't ask. 也就是说告诉object去做什么, 而不是问
他detail的information.
所以一般来说一个type 同时有很多 getter/setter, 基本上不应该给他其他的
behavior, 而他仅仅充当一个 data 容器, 也就是struct, 反过来真正的class 一般
应该避免同时又setter/getter
而class可以有get, 而这个get 一般... 阅读全帖 |
|
t****n 发帖数: 167 | 44 California Athletes participating in the 2012 Olympics
Posted on July 27, 2012 at 6:02 AM
Updated Friday, Jul 27 at 6:30 AM
Here is a list of California Athletes participating in the 2012 Olympics:
----------------------------------
Kyle Alcorn, Clovis, Calif., 3,000m Steeplechase
Samuel Mikulak, Newport Beach, Calif., Gymnastics, Artistic
Tumua Anae, Newport Beach, Calif., Water Polo, Goalkeeper
Alyssa Anderson, Granite Bay, Calif., Swimming, 800m free relay
Haley Anderson, Granite Bay, Calif.,... 阅读全帖 |
|
S**********r 发帖数: 1410 | 45 I suggest you
1. move backgroundImageView.hidden = !selected;
to within
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
because it's not a good idea to manipulate UI in a data member's setter.
2. let system generate setter and getter for you. |
|
L*******e 发帖数: 334 | 46 I assembled a mountain bike, using this set of tools, plus a few more: cable
/housing cutter, threadless nut setter, crown race setter.
tool.
go |
|
T**r 发帖数: 7016 | 47 呵呵,东西到货了,组装起来,用了一下,哇,真是好用哦。
请猜这是做什么用的,发包10个。
---已公布答案
普通的1吨Arbor Press,加上自已DIY的接受各种rivet setter的接口。
亮点一:这个万用接口是一只老drill的chuck,可以接受上到3/8"的setter或者stamp。
亮点二:从冰箱贴上找到几个钮扣磁片,叠在一起,正好压进这个chuck的背后洞里,
这样
这个chuck就可以吸在arbor上,而不用在上面钻洞。吸力大概有15磅左右,完全足够。 |
|
E***y 发帖数: 336 | 48 回国了一段时间,发现国内的攀岩发展不乐观。
北上广好些,攀岩馆和国外类似,或者正在努力学习国外模式,起码路子对了。
估计攀岩发达地区比如阳朔什么的,没去过,应该和北上广类似,甚至更高。
但是三线小城市,就比较悲剧了。先不说条件,首先文化,风气上就不好。
小城市纯粹的草根发展,大部分都是一小拨死硬分子自发筹钱,弄个抱石馆。
墙上都是点,没几个点是贴胶带的,就三四条线路意思一下。
他们满足于平时随便定几点,一般是拿激光笔和刷子指一指。
然后几个人在那里死磕,动作越难越好,特别喜欢动态,挂脚,特别是高脚的动作。
一般每天100元,每年2500-3000的样子。第一次去抱着支持的心态,付费玩了一会。
问为什么没线路,他们说平时爬的人少,太费劲。问我需要什么样的,他们都可以定。
然后随便给我指了指几个点,水平不敢恭维,后来去了几次发现还那样,就不去了。。
前两天有人在QQ群里问本地哪里有攀岩的地方,我告诉她不要期望太高,没啥线路。
那个攀岩馆的经理就问我要什么样的线路,可以给我定制。看起来服务很好。
我说要的是个有难度梯度的线路体系。不适应那种现定线的。
她说是定线员的问题,然后那个定线员就忍不... 阅读全帖 |
|
T*********e 发帖数: 39815 | 49 setter的工资非常低,美国这边的gym工作人员hourly pay比最低工资好不到哪儿去
要是有兴趣当setter,可以看看这个网站
http://usacsetting.net |
|
c****1 发帖数: 5654 | 50 beginners usually play center setter, i like to play either 5-1, or
6-2, in which case each position has its own role.
We normally play 3 guys do the first pass, usually 2 OHs, and 1 OPP or
setter in front row. |
|