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

Sur*_*nga 68 lazy-loading class lazy-evaluation getter-setter

在我的班级中更改我的getter方法(如版本2)是不好的做法.

版本1:

 public String getMyValue(){
     return this.myValue
 }
Run Code Online (Sandbox Code Playgroud)

版本2:

 public String getMyValue(){

    if(this.myValue == null || this.myValue.isEmpty()){
       this.myValue = "N/A";
    }

    return this.myValue;
 }
Run Code Online (Sandbox Code Playgroud)

fgy*_*ica 116

我认为如果你的getter方法改变了对象的内部状态,那实际上是非常糟糕的做法.

为了达到同样的,我建议刚回国"N/A".

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

另外,从翻译null"N/A"可以在做二传手,即内在价值可以设置为"N/A",如果null获得通过.


一般说法:
我只会添加一些状态,例如"N/A"某些API或依赖于您的代码的其他实例所期望的状态.如果不是这种情况,您应该依赖编程语言中可用的标准null类型.

  • 请注意:我觉得getter可以在延迟加载的情况下更改对象的内部状态,在这种情况下,您只需要在调用getter时才加载数据. (41认同)
  • 我认为改变getter中对象的内部状态没有任何问题.对象的内部状态是类作者的业务.作为班级的用户,只要外部接口一致**,您就不应该知道(或关心)内部发生的事情.因此,无论他是在设置器中设置值还是懒惰地设置在getter中,这都是完全有效的.重要的是,getter始终为null或空值返回N/A. (6认同)
  • 很公平,这是一个有效的用例.但OP描述的情况可能导致可怕的副作用. (5认同)
  • +1返回"N/A"而不是更改值 (4认同)
  • 没有什么比处理在getter上更改状态的Property以及每次调试器的某个组件访问它时调试状态都更令人烦恼的了. (4认同)

Vin*_*rat 38

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

将更改放入setter

public void setMyValue(String value) {
    if(value == null || value.isEmpty()){
        this.myValue = "N/A";
    } else {
        this.myValue = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果未正确设置值,则使getter返回默认值:

public String getMyValue() {
    if(this.myvalue == null || this.myvalue.isEmpty()){
        return "N/A";
    }    
    return this.myValue;
}
Run Code Online (Sandbox Code Playgroud)

在延迟加载的情况下,我会说在getter中更改你的成员很好,你会做类似的事情:

public String getMyValue() {
    if (this.myvalue == null) {
        this.myvalue = loadMyValue();
    }    
    return this.myValue;
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*k W 11

不,你在这里做两件事.获取和设置.


hqt*_*hqt 10

是.这是一个不好的做法.

为什么?

当该值被导入到对象(在构造函数,或setter方法),这些值将被验证,不验证直到吸气方法被调用.而且,如果有人小心,他们也会为这个值创建一个完整的私有验证方法.

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,在getter方法中,永远不要改变值的状态.我曾经在一些项目上工作过,而且经常必须将getter设置为private:此方法不能改变内部状态.

至少,如果你不想让事情变得复杂,在getter方法中,你应该返回 "N/A"而不是改变内部状态,将myValue设置为"N/A".

  • 我不同意永远不会改变二传手的价值.使用getter/setter的整个目的是抽象内部和外部实现.`Person.setHeightInCentimeters(int value)`,`Person.setHeightInMeters(double value)`和`Person.setHeightInFeetAndInches(int feet,int inches)`应该共享一个内部表示,这意味着它们中至少有两个将是存储除输入值之外的其他内容. (4认同)

Rod*_*igo 6

我通常定义一个特定的getter.

永不改变原件getter:

 public String getMyValue(){
     return this.myValue
 }
Run Code Online (Sandbox Code Playgroud)

并创建一个具体的getter:

public String getMyValueFormatted(){

    if(this.myvalue == null || this.myvalue.isEmpty()){
       return "N/A";
    }else{
       return this.myValue;
    }
 }
Run Code Online (Sandbox Code Playgroud)


Geo*_*e D 5

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