Java getter vs this

时间:2011-03-05 11:51:26

标签: 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() {
    //METHOD1
    System.out.println(getStr());
    //METHOD2
    System.out.println(this.str);
  }
}
  1. 在显示功能中,两个METHOD1 / 2之间遵循什么是更好的做法,基本上是使用“str”变量的更好方法。

  2. 拥有私有的getter / setter函数是否有意义?

    • Ivard

5 个答案:

答案 0 :(得分:3)

如果getter是私有的,并且只是返回一个私有变量,则不需要它,恕我直言(即我更喜欢第二种访问它的方法)。

但是如果getter是公共的而不是final,并且因此可以由子类重新定义,那么你必须决定是否要获取getter返回的可能被覆盖的值,或者如果你想要的值显示方法中的私有字段。

答案 1 :(得分:2)

此处应至少有一条评论

通过提供新的抽象障碍,您可以分离数据访问者和数据表示。例如,让我们看一下复数类。哪个可以实现为

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;
    }
}

极坐标表达式形式

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;
    }
}

假设你应该实现像+ - / *这样的基本操作。你应该选择什么样的演示模型?对于加法和减法标准模型是优选的,但对于乘法和除法极性形式是优选的。因此,您可以为两种形式创建getter。并实现添加 / _ sub_,就像你有标准模型一样, div / _ mult_就像极性形式一样。此操作不依赖于您的实际数据显示。对于更改演示文稿,您应该更改getter。就这样。在Java世界中,它被称为自封装

答案 2 :(得分:1)

除非您在 public getter中有副作用,否则我会考虑始终使用this来保持一致性,除非假设继承。

使用 私有 访问器对我来说根本没有任何意义。例程通常应该只做一个事物,最好没有副作用。创建一个私人的getter

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

使用this也可能使重构更容易[1]。

[1]重构私有变量比重构方法的影响小。如果您以后决定更改合同,例如,不再提供 getter 例程,您将获得更少的重构。此外,许多编辑器在将光标指向变量时突出显示变量的所有出现,当将其用于子例程时,该变量会丢失。

答案 3 :(得分:1)

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

  2. 对于您只是分配和获取私有成员的琐碎案例,不是真的。对于可能需要执行其他逻辑的更复杂情况,将该逻辑限制在一个地方是有意义的。与1.一样,如果您希望子类重写方法,那将是有意义的。

答案 4 :(得分:0)

不,拥有私有的getter / setter方法没用。如果它们是公共的或者是子类可以覆盖的,尽管这是一个不同的故事。如果子类覆盖了getter / setter,它可能会改变display()方法的运行方式。