对于在公共类中声明的类成员定义,使用getters / setter将变量声明为私有是否有意义?

时间:2011-06-04 05:37:35

标签: java

class Foo {
    String bar;
    // private String bar;
}

public class A {
    public void method1() {
        Foo foo = new Foo();
        // foo.bar; or foo.getBar(); which is preferable

    }
}

使用类成员定义的getter / setter将变量声明为私有是否有意义(例如,barFoo应声明为私有,或者应将其声明为String bar )?我宁愿删除它们,感觉无论如何它们都无法在本课程之外访问。什么会更好?

4 个答案:

答案 0 :(得分:1)

如果它仅用于数据访问,那么没有getter / setter应该没问题(一些纯粹主义者可能不同意)。并且您的类应该能够访问内部类的私有成员,以便您可以将它们保密。

答案 1 :(得分:1)

使用getter和设置来访问/改变私有字段成员是标准的OO实践。它允许类的内部工作在保持其公共接口的同时进行更改。

如果您通过将其作为公共界面的一部分直接提供(通过公开)来访问/变异bar,它现在看起来似乎很好但是几个月后,您决定要发生什么时会发生什么?为bar添加一些验证?也许您不希望将bar设置为null。你怎么能实现这个目标?如果您使用getter和setter,那么您需要做的就是更改setter,以便在尝试将bar设置为null时抛出异常。如果你直接改变bar,你就不能这样做。更严重的是,您可能会认为根本不再需要bar

getter和setter并不意味着类的内部存在同名和类型的字段成员。它们只告诉您该类具有可以访问/变异的属性,并且不指示该类在内部执行的方式。这为您提供了很大的灵活性。

答案 2 :(得分:1)

让Foo成为内部类并且没有getter / setter:

public class A {
    private class Foo {
        String bar;
    }

    public void method1() {
        Foo foo = new Foo();
        foo.bar = "x";
    }
}

设计是好的,因为Foo只在A中可见 - 它并不比直接在类中访问私有字段而不是通过getter更糟糕。

答案 3 :(得分:0)

请先回答:为什么method1需要了解foo的{​​{1}}?为什么bar需要知道method1甚至首先 Foo