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

问题描述

|
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中将变量声明为私有是否有意义(例如,应在
Foo
中将
bar
声明为private还是应将其仅声明为
String bar
)?我宁愿删除它们,因为无论如何不能在此类之外访问它们。有什么更好的选择?     

解决方法

        使用getter和设置访问/更改私有字段成员是标准的OO实践。它允许更改类的内部工作原理,同时保持其公共接口。 如果您要通过直接将ѭ1as作为公共接口的一部分来访问/变异(使其公开),现在看起来似乎还不错,但是几个月后,您决定要向
bar
添加一些验证,会发生什么呢?也许您不希望将ѭ1设置为
null
。你怎么能做到?如果您使用getter和setter,那么只要尝试将“ 1”设置为“ 7”,您所要做的就是更改您的设置器以引发异常。如果直接突变
bar
,则无法这样做。更彻底地讲,您可能决定不再需要
bar
! Getter和Setter并不意味着在类内部存在具有相同名称和类型的字段成员。它们仅告诉您该类具有可以访问/更改的属性,并且对该类在内部执行该操作的方式没有任何限制。这给您很大的灵活性。     ,        如果仅用于数据访问,则没有getter / setter方法也可以(有些纯粹主义者可能会不同意)。并且您的班级应该能够访问内部班级的私有成员,这样您就可以将其保持私有状态。     ,        使Foo成为内部类,并且没有getter / setter:
public class A {
    private class Foo {
        String bar;
    }

    public void method1() {
        Foo foo = new Foo();
        foo.bar = \"x\";
    }
}
这是可以的设计,因为Foo仅在A内可见-这不比直接通过类而不是通过getter访问私有字段更糟糕。     ,        请先回答:为什么
method1
需要了解
foo
bar
?为什么
method1
首先需要知道
Foo
甚至有
bar
?