使用Getter访问私人实例变量是一个很好的编码实践



最近,我得到了一个代码评论评论,用于使用getter方法来访问同一类的私有实例变量。这真的是一个好习惯吗?我觉得这增加了代码中不必要的并发症。推荐的方式是什么?

public class SomeClass {
    String abc;
    public boolean compare(SomeClass otherClass) {
        otherClass.getAbc().equals(abc);
    }
}
public class SomeClass {
    String abc;
    public boolean compare(SomeClass otherClass) {
        otherClass.getAbc().equals(getAbc());
    }
}

我在您的第一种方法中看到了一个非常具体的问题。您不一致地使用Getters。

public boolean compare(SomeClass otherClass) {
    otherClass.getAbc().equals(abc);
    //.getAbc() for one, but direct access for the other!!
}

您必须将苹果与苹果进行等效方法进行比较,如果您使用getter检索了一个变量以进行比较(我认为我认为是公开的,可以被覆盖),并且另一个变量直接从私人变量中检索(这不能被覆盖),那么您使代码比需要的要脆弱得多。如果有人扩展您的班级并更改Getter方法怎么办?您的代码将被软管。因此,在两者上使用getter。

考虑到这一点,这两个都比您的原始行为更好,因为该行为更稳定:

public boolean compare(SomeClass otherClass) {
    otherClass.abc.equals(abc);
}

public boolean compare(SomeClass otherClass) {
    otherClass.getAbc().equals(getAbc());
}

出于一般目的,这取决于您如何使用数据。大卫的答案列出了一些用于普遍使用Getters的资源。

您的审稿人完全有可能只谈论普通案例,但我认为他们可能只是很难传达问题。

从理论上讲,使用类中的getters和setter可以提供代码重用,例如,如果设置器进行某种范围检查,这也很有用。在实践中,我从未见过这确实是有益的情况。

理想情况下,班级应该根本没有播放器和盖特斯。

为什么没有设置?因为它们提供了可变状态,这会引起许多问题。通常在构造函数中分配了类变量,并且以后永远不会更改。

为什么没有得到?因为班级应该充当单位。创建类的目的不仅是为不同变量提供一个临时容器,只是为了以后提取它们。那不是封装。

最新更新