让我的getter方法改变存储值是不好的做法吗?

时间:2012-12-14 09:41:55

标签: class lazy-loading lazy-evaluation getter-setter

在课堂上更改我的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;
 }

14 个答案:

答案 0 :(得分:116)

如果你的 getter 方法改变了对象的内部状态,我认为这实际上是一个很糟糕的做法。

要达到同样的效果,我建议返回 "N/A"

  • 一般来说,这个内部字段可能在其他地方(内部)使用,您不需要使用getter方法。最后,对foo.getMyValue()的调用实际上可能会改变foo
  • 的行为

或者,可以在 setter 中完成从null"N/A"的转换,即如果{{1},内部值可以设置为"N/A"传递。


一般性评论:
我只会添加诸如null之类的状态,如果某些API或依赖于您的代码的其他实例所期望的那样。如果不是这种情况,您应该依赖编程语言中可用的标准null类型。

答案 1 :(得分:38)

在我看来,除非你正在做lazy-loading(你不是那种情况),否则吸气者不应该改变价值。所以我要么:

将更改放入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;
}

答案 2 :(得分:11)

没有。你在这里做了两件事。获取和设置。

答案 3 :(得分:10)

是。这是一种糟糕的做法。

为什么?

当设置值时(在构造函数或setter方法中),应该验证它,而不是在调用getter方法时。为此创建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方法中,永远不要改变对象的状态。我曾经参与过一些项目,而且经常必须设置getter const:“这种方法不能改变内部状态”。

至少,如果您不想让事情复杂化,那么在getter方法中,您应该返回 "N/A"而不是更改内部状态并设置{ {1}}至myValue

答案 4 :(得分:6)

我通常会定义一个特定的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;
    }
 }

答案 5 :(得分:5)

我认为最好初始化this.myValue = "N/A"。随后对setMyValue的来电应根据您的业务条件修改this.myValue getMyValue不应以任何方式this.myValue进行修改。如果您需要返回某个值,则应返回该值(如“N / A”)而不是更改this.myValue。 Getters不得修改成员的价值。

答案 6 :(得分:4)

我会更好地更改setter方法,因此,如果值为null或为空,则N/A将分配给该属性。因此,如果您在类中的其他方法中使用该属性(v.g。toString()),那么您将获得预期的值。

或者,更改setter方法以在设置的值不正确时启动异常,因此程序员必须在设置值之前改进其处理。

除此之外,没关系。

答案 7 :(得分:4)

我确实觉得这是一个糟糕的做法,除非你解释为什么你必须修改getter方法中的对象而不是在setter方法中做这个。
你觉得由于某种原因不能这样做吗?你能详细说明一下吗?

答案 8 :(得分:4)

做你喜欢的事。毕竟getter和setter只是另一种公共方法。你可以使用任何其他名称。

但是如果你使用像Spring这样的框架,你必然会使用这些标准名称,你永远不应该把自定义代码放在其中。

答案 9 :(得分:4)

setter可以作为验证的一部分进行修改,但是getter应该返回值并让调用者完成验证。如果您执行验证,那么应该如何记录。

答案 10 :(得分:3)

这实际上在很大程度上取决于您要使用get()方法强制执行的合同。根据按合同设计约定,调用者必须确保满足前提条件(这意味着在setter方法中进行验证通常实际上是糟糕的设计)和被调用者(我不知道这是否是正确的英语术语那个,即被叫一个)确保满足后期条件。

如果您定义合约以便不允许get() - 方法更改对象,那么您将违反自己的合同。考虑实现像

这样的方法
public isValid() {
    return (this.myvalue == null || this.myvalue.isEmpty());
}

这种方法的优点是你不必检查你的get()的返回是“N / A”还是别的。这也可以在调用set()之前调用,以验证您不会在对象中插入非法值。

如果要设置默认值,则应在初始化期间执行此操作。

答案 11 :(得分:3)

绝对是的,这是一个糟糕的实践。

想象一下,您通过网络与第三方进行通信(远程处理,COM,......),这将增加往返次数,然后达到应用程序性能。

答案 12 :(得分:3)

吸气剂的状态变化应该是悬而未决的罪行。这意味着客户端代码必须小心它访问getter和setter的顺序,并且为此必须知道实现。您应该能够以任何顺序调用getter并仍然获得相同的结果。当setter根据对象的当前状态修改传入值时会发生相关问题。

答案 13 :(得分:2)

您可以为此目的使用一些价值持有人。和guava库中的Optional类一样。