问题描述
|
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
?