使用getter访问私有实例变量是一种很好的编码实践吗?

时间:2016-06-21 21:20:11

标签: java coding-style

最近我得到了一个代码审查注释,使用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());
    }
}

2 个答案:

答案 0 :(得分:5)

我看到第一种方法存在一个非常具体的问题。你不一致地使用getter。

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

你必须比较苹果和苹果的equals方法,并且如果使用getter检索你的一个变量进行比较(我假设它是公共的并且可以被覆盖)而另一个直接从私有变量中检索(这是不可覆盖的,然后你使你的代码比它需要的更脆弱。如果有人扩展你的课程并改变了getter方法怎么办?你的代码将被软管化。因此,在两者上使用getter或者不使用getter。

考虑到这一点,其中任何一个都比原来更好,因为行为更稳定:

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


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

出于一般目的,这取决于您使用数据的方式。 David的回答列出了一些吸气剂的一般用法资源。

完全有可能你的评论者只是在谈论一般情况,但我认为他们可能只是很差地传达了这个问题。

答案 1 :(得分:3)

理论上,在类中使用getter和setter可以提供代码重用,例如,如果setter执行某种范围检查,这在类中也很有用。在实践中,我从未见过一个真正有益的案例。

理想情况下,一个班级根本不应该有制定者和吸气剂。

为什么没有二传手?因为它们提供可变状态,这会导致很多问题。理想情况下,类变量应在构造函数中赋值,以后不再更改。

为什么没有吸气剂?因为一个班级应该作为一个单位。创建类的关键不仅仅是为不同的变量提供一个临时容器,以便稍后逐个提取它们。那不是封装。