Java getter vs this

Java getter vs this,java,Java,这是一个非常通用的场景,我使用setter函数设置变量,并且仅在本地使用该变量 class Main { private String str; public Main(String value) setStr(value); } private String getStr() { return str; } private void setStr(String str) { this.str = str; } public void display(

这是一个非常通用的场景,我使用setter函数设置变量,并且仅在本地使用该变量

class Main {
 private String str;

 public Main(String value)
  setStr(value);
 }

 private String getStr() {
    return str;
 }

 private void setStr(String str) {
    this.str = str;
 }

 public void display() {
    //METHOD1
    System.out.println(getStr());
    //METHOD2
    System.out.println(this.str);
  }
}
  • 在显示函数中的两种方法1/2之间遵循什么更好的实践,基本上使用“str”变量的更好方法是什么

  • 拥有私有getter/setter函数有意义吗

    • 伊瓦德

  • 除非您在您希望的<强>公共>强> GETter中有副作用,否则我将考虑始终使用<代码> < < /> >以实现一致性,除非假定继承。p> 雇用私人访问者对我来说毫无意义。常规疗法通常只能做一件事,最好没有副作用。创建私有getter

    • 没有副作用只会产生无用的冗余
    • 副作用基本上证明该方法做得太多或命名不当

    使用
    这个
    也可能使重构更容易[1]


    [1] 重构私有变量的影响小于重构方法。如果您以后决定更改契约,例如,不再提供getter例程,那么重构的机会就会减少。此外,许多编辑器在将光标指向某个变量时会突出显示该变量的所有出现,而在子例程中隐藏该变量的使用时会丢失该变量

    不,使用私有getter/setter方法是没有用的。如果它们是公共的或者可以被子类重写,那么情况就不同了。如果子类重写了getter/setter,它可能会改变
    display()
    方法的工作方式。

    如果getter是私有的,只返回一个私有变量,那么就不需要它,IMHO(即,我更喜欢第二种访问它的方法)

    但是,如果getter是公共的而不是最终的,因此可以由子类重新定义,那么您必须决定是要获取getter返回的潜在重写值,还是要在display方法中获取private字段的值

  • 对于简单的情况,您只需使用
    this.str
    。对于更复杂的情况,您可能希望从这样的类继承,并在子类中实现getStr(),也许它会从文件/数据库中惰性地获取字符串。那么这些方法就不是私有的了

  • 对于只分配和获取私有成员的简单情况,实际上不是这样。对于可能需要执行额外逻辑的更复杂的情况,将该逻辑限制在一个地方是有意义的。与1一样,如果您希望子类也重写方法,那么这是有意义的


  • 这里应该至少有一条评论,带有

    通过提供新的抽象屏障,您可以分离数据访问器和数据表示。例如,让我们看看复数类。它可以实现为

    class ComplexNumber {
        private final double realPart;
        private final double imaginaryPart;
    
        ComplexNumber(double realPart, double imaginaryPart) {
            this.realPart = realPart;
            this.imaginaryPart = imaginaryPart;
        }
    
        public double getRealPart() {
            return realPart;
        }
    
        public double getImaginaryPart() {
            return imaginaryPart;
        }
    }
    
    或者以极性表达的形式


    假设您应该实现像+-/*这样的基本操作。您应该选择哪种演示模式?对于加法和减法,最好使用标准模型,但对于乘法和除法,最好使用极坐标形式。因此,您可以为这两种形式创建getter。并实现add/_sub_u,就像使用极坐标形式实现标准模型和div/_mult_u一样。此操作不依赖于实际的数据表示。对于更改演示,您应该更改getter。就这些。在Java世界中,它被称为自封装

    嗯,你的
    sin/cos
    表现应该是什么?通常的极坐标表示法是(半径、角度),通过对角度应用正弦和余弦并将结果乘以半径,可以将其转换为笛卡尔形式。通常情况下,
    int
    在这里不是一个好的数据类型,如果您想在表示之间进行转换,更是如此。@Paŭlo Ebermann,int只是一个例子。用极坐标表示——当然半径和角度是我的错。谢谢修正了。现在更好了,但我仍然建议将int改为double,以获得更现实的示例。
    class ComplexNumber {
        private final double r;
        private final double angle;
    
        ComplexNumber(double r, double angle) {
            this.r = r;
            this.angle = angle;
        }
    
        public double getR() {
            return r;
        }
    
        public double getAngle() {
            return angle;
        }
    }