让我的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根据对象的当前状态修改传入值时,会发生相关问题。

您可以为此使用一些价值持有人。 像番石榴库中的可选类。