Java约定:在类中使用 getters/setters?

2022-08-31 14:58:33

我的教授非常强调通过始终使用访问器和突变体来访问私有实例变量来防止隐私泄露;但是,我是否必须在类中使用类的 getters/setters?

例如,如果我有以下类:

public class Person 
{
    private String name;
    private int age;
}

我想为它写一个toString()方法。我可以写:

public String toString()
{
    return name + " " + age;
}

或者我需要做这样的事情:

public String toString()
{
    return this.getName() + " " + this.getAge();
}

答案 1

你可以做任何一个。但是,您的教授可能会喜欢使用这些方法而不是直接访问。原因如下。

假设您有一个这样的类:

class SomeClass {
    private int someValue;
    private String someString;

    public SomeClass(int someValue, String someString) {
        this.someValue = someValue;
        this.someString = someString;
    }

    public int someValue() {
        return this.someValue;
    }

    public String someString() {
        return this.someString;
    }

    public String toString() {
        return someValue + ": " + someString;
    }

}

这很简单,对吧?好吧,如果突然之间我们想改变计算方式的实现,并以此为基础呢:someValuesomeString

public int someValue() {
    int value = 0;
    for(int i = 0; i < someString.length; i++) {
         if(someString.charAt(i) == ' ') value++;
    }
    return value;
}

现在,您还必须更改使用变量的每个位置。someValue

因此,从长远来看,如果要使代码更易于维护,请使用方法调用。这样,当你对你进行代码更改时(相信我,它一直在变化),你只需要在一个地方而不是两个地方改变它。

是的,你会想在get中使用方法调用,而不是在最后一个方法中使用直接访问:-)someString


答案 2

当我设计一个类时,我试图明确区分内部(实现细节)和外部(向世界公开的接口)。Getter 和 setter 提供了一个方便的位置,用于在对象的实例成员中存储值的形式和外部世界看到它们的窗体之间转换值。在内部使用 getter 和 setter 会搞砸,因为它们会被内部和外部使用。

如果您发现自己想要从同一类的另一部分中隐藏某个类的一部分,请考虑将要隐藏的部分拆分到其自己的类中。