让我的getter方法更改存储值是不好的做法吗?
在我的课堂中更改我的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; }
如果你的getter方法改变对象的内部状态,我认为这实际上是一个不好的做法。
为了达到同样的效果,我build议你只是返回 "N/A"
。
- 一般来说,这个内部字段可能在其他地方(内部)使用,您不需要使用getter方法。 所以最后,调用
foo.getMyValue()
实际上可以改变foo
的行为。
或者,可以在setter中完成从null
到"N/A"
的转换,即如果传递null
则可以将内部值设置为"N/A"
。
一般的评论:
我只会添加诸如"N/A"
如果这些状态是由某个API或其他依赖于您的代码的实例所预期的。 如果不是这种情况,则应该使用编程语言中可用的标准空types。
在我看来,除非你在做lazy-loading
(你不是这种情况),getters不应该改变它的值。 所以我会:
把改变放在setter中
public void setMyValue(String value) { if(value == null || value.isEmpty()){ this.myValue = "N/A"; } else { this.myValue = value; } }
或者,如果值设置不正确,则使getter返回默认值:
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; }
不,你在这里做两件事。 获取和设置。
是。 这是一个不好的做法。
为什么?
当值被导入到对象中时(在构造函数或setter方法中),这些值将被validation,直到getter方法被调用才被validation。 而且,如果有人小心,他们也会为这个值创build一个完整的私有validation方法。
private boolean validateThisValue(String a) { // return true or false // in this example will be if(this.myvalue == null || this.myvalue.isEmpty()){ return false; } else { return true; } } 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方法中,永远不会改变价值状态。 我曾经在一些项目上工作,getter常常必须设置为const
:这个方法不能改变内部状态。
至less,如果你不想要这个复杂的东西,在getter方法中,你应该返回 “N / A”,而不是改变内部状态,设置myValue为“N / A”。
希望这个帮助:)
我认为最好是初始化this.myValue = "N/A"
。 随后对setMyValue
调用应根据您的业务条件修改this.myValue
。
getMyValue
不应以任何方式修改this.myValue
。 如果你的需求是返回一个特定的值,你应该返回该值(如“N / A”),而不是改变this.myValue
。 吸气者不得修改成员的价值。
我通常定义一个特定的getter
。
永远不要改变原来的getter
public String getMyValue(){ return this.myValue }
并创build一个特定的getter
:
public String getMyValueFormatted(){ if(this.myvalue == null || this.myvalue.isEmpty()){ return "N/A"; }else{ return this.myValue; } }
我会改变更好的设置方法,所以,如果值为null
或空, N/A
分配给属性。 所以,如果你在类中使用其他方法的属性(vg toString()
),那么你将在那里得到预期的值。
或者,如果设置的值不正确,则更改setter方法以启动exception,因此程序员必须在设置值之前改进其处理。
除此之外,没关系。
我觉得这是一个糟糕的做法,除非你直到你解释为什么你需要修改getter方法内的对象而不是在setter方法内部这样做的原因。
你觉得由于某种原因无法完成吗? 你能否详细说明一下?
做任何你喜欢的事情。 毕竟获得者和制定者只是另一种公共方法。 你可以使用任何其他的名字。
但是如果你使用像Spring
这样的框架,你一定会使用这些标准名称,你不应该把你的自定义代码放在里面。
一个setter可以作为validation的一部分进行修改,但是getter应该返回这个值,并且让调用者完成validation。 如果你确认了,那么应该如何logging。
这实际上很大程度上取决于你想用get()方法执行的合同。 根据契约约定,调用者必须确保满足前提条件(这意味着在setter方法中进行validation通常实际上是不好的devise),被调用者(我不知道这是否是正确的英文术语即被叫方)确保满足后置条件。
如果你定义了你的合约,这样get()方法就不允许改变这个对象,那么你就违反了自己的合同。 考虑实施一个像
public isValid() { return (this.myvalue == null || this.myvalue.isEmpty()); }
这种方法的好处是,你不必检查你的get()的返回是“N / A”还是别的什么。 这也可以在调用set()之前调用,以确认您不会将非法值插入到对象中。
如果你想设置一个默认值,你应该在初始化的时候这样做。
绝对是的,这是一个不好的实践。
想象一下,你与第三方(远程处理,COM,…)通过networking进行通信,这将增加往返,然后打击应用程序的性能。
吸气者的状态变化应该是一个悬而未决的罪行。 这意味着客户端代码必须注意访问getter和setter的顺序,并且这样做必须具备实现的知识。 您应该能够以任何顺序调用获得者并且仍然得到相同的结果。 当setter根据对象的当前状态修改传入值时,会发生相关问题。
您可以为此使用一些价值持有人。 像番石榴库中的可选类。