它是不好的做法,改变我的getter方法类似版本2在我的课。
版本1:
public String getMyValue(){
return this.myValue
}
版本2:
public String getMyValue(){
if(this.myValue == null || this.myValue.isEmpty()){
this.myValue = "N/A";
}
return this.myValue;
}
Answer 1:
我认为它实际上是一个相当不好的做法,如果你的getter方法改变对象的内部状态。
为了达到同样的,我建议刚返回 "N/A"
。
- 一般说来,该内部磁场可能在其他地方(内部),而您无需使用getter方法来使用。 所以,最后,调用
foo.getMyValue()
实际上可以改变的行为foo
。
可替代地,从翻译null
到"N/A"
可以在设定器来完成,即,内部值可以被设置为"N/A"
,如果null
传递。
总体意见:
我只想补充状态,如"N/A"
,如果他们是通过一些API或其他情况下依靠你的代码的预期。 如果不是这种情况,你应该依靠标准的空值类型,在你的编程语言提供给您。
Answer 2:
在我看来,除非你正在做lazy-loading
(你不是在这种情况下),干将不应该改变的价值。 所以我会之一:
把变化的二传手
public void setMyValue(String value) {
if(value == null || value.isEmpty()){
this.myValue = "N/A";
} else {
this.myValue = value;
}
}
或使吸附剂返回默认值,如果值设置不正确:
public String getMyValue() {
if(this.myvalue == null || this.myvalue.isEmpty()){
return "N/A";
}
return this.myValue;
}
在延迟加载,在这里我要说的是,改变你的成员一个getter是罚款的情况下,你会做这样的事情:
public String getMyValue() {
if (this.myvalue == null) {
this.myvalue = loadMyValue();
}
return this.myValue;
}
Answer 3:
Answer 4:
是。 这是一个不好的做法。
为什么?
当该值被设置(在一个构造或setter方法),它应该被验证,而不是当吸气方法被调用。 创建一个private
validate*
此方法也是一个好主意。
private boolean validateThisValue(String a) {
return this.myValue != null && !this.myValue.isEmpty();
}
public void setThisValue(String a) {
if (validateThisValue(a)) {
this.myValue = a;
}
else {
// do something else
// in this example will be
this.myValue = "N/A";
}
}
而且,在getter方法,永远都不要改变对象的状态。 我有一些项目合作,并吸气往往必须由const
:“这种方法不能改变内部状态”。
至少,如果你不想在getter方法复杂的事情,你应该返回 "N/A"
,而不是改变内部状态和设置myValue
以"N/A"
。
Answer 5:
我通常定义一个特定getter
。
永远不要改变原来getter
:
public String getMyValue(){
return this.myValue
}
并创建一个特定getter
:
public String getMyValueFormatted(){
if(this.myvalue == null || this.myvalue.isEmpty()){
return "N/A";
}else{
return this.myValue;
}
}
Answer 6:
我觉得这是更好地初始化this.myValue = "N/A"
。 以及随后调用setMyValue
应该修改this.myValue
根据自己的经营状况。
该getMyValue
不应该以任何方式修改this.myValue
。 如果你的需求是返回一定值时,你应该返回值(如“N / A”),并不会改变this.myValue
。 干将不得修改成员的值。
Answer 7:
我想改变更好setter方法是这样,如果该值是null
或空,则N/A
被分配给该属性。 所以,如果你使用的类中的其他方法的属性(VG toString()
您将有预期的价值在那里。
可替代地,改变设置器方法来启动一个异常时,被设置的值是不正确的,所以程序员被迫之前设置的值,以提高其处理。
除此之外,它是确定。
Answer 8:
我不觉得这是一个不好的做法 ,除非和直到你解释为什么你修改getter方法里面的对象,而不是做它的setter方法里面的它是如此必要的原因。
你觉得这不能出于某种原因做? 能否请你解释一下?
Answer 9:
你什么都喜欢。 所有的getter和setter方法后只是另一个公共方法。 你可以使用任何其他名称。
但是,如果你使用的框架,如Spring
,你一定要使用这些标准的名称,你永远不应该把它们内部的自定义代码。
Answer 10:
setter是可以修改的验证的一部分,而是一个getter应返回的值,并让验证调用者来完成。 如果确认,那么应该如何进行记录。
Answer 11:
其实,这在很大程度上取决于你想与你的get()强制执行合同 - 方法。 根据设计,按合同约定的调用者,以确保前提条件得到满足(这意味着在setter方法做一个验证常常实际上是糟糕的设计)和被叫方(我不知道这是正确的英文术语即,即所谓的一个)可以确保后置条件得到满足。
如果你定义你的合同,这样的get() - 不允许的方法来改变对象,那么你正在打破自己的合同。 想想实施等的方法
public isValid() {
return (this.myvalue == null || this.myvalue.isEmpty());
}
这种方法的优点是,你不必请检查是否你的get()的返回是“N / A”或别的东西。 这也可以调用set()来验证你不插入非法值到你的对象之前被调用。
如果你想设置初始化过程中你应该做的是一个默认值。
Answer 12:
绝对是的,这是一个不好的实践。
想象一下,你翻过通信网络与第三方(远程,COM,...),这会增加往返,然后点击应用程序的性能。
Answer 13:
在干将状态的变化应该是一个挂罪行。 这意味着,客户端代码必须小心其所访问的getter和setter秩序,要做到这一点就必须有实施的知识。 你应该能够调用任何顺序getter和仍然得到同样的结果。 当装定修改根据对象的当前状态输入的值时,发生一个相关的问题。
Answer 14:
你可以使用一些值保持用于这一目的。 像番石榴库可选类。
文章来源: Is it bad practice to have my getter method change the stored value?