6

目前我们正在我们的代码库上运行checkstyle,它会标记任何不使用私有访问修饰符的非静态类字段。

这是一个有效的检查样式规则,还是存在需要非私有字段的情况?例如,我认为在同一个包中创建 JUnit 测试用例的原因是它们可以使用默认访问修饰符访问字段?

4

6 回答 6

7

面向对象编程的主要特征之一是信息隐藏/封装。这意味着一个类只允许通过接口访问成员变量:getter 和 setter 方法。因此其他类无法访问成员变量并以不需要的方式修改它们。所以 checkstyle 规则是有效的

于 2011-03-30T10:09:17.003 回答
6

Effective Java 2nd 的第 13 项:最小化类和成员的可访问性。

看一下这个。它提供了很棒的想法。

于 2011-03-30T10:07:45.687 回答
5

private恕我直言,最好尽可能地制作字段final。然而,对于单元测试,将它们设为包私有或通过反射访问它们可能是一个务实的选择。(这相当于同一件事)

您还可以采用黑盒测试的方法,这意味着除非您可以通过公共方法确定发生了什么,否则不应对其进行测试。(或者您的测试需要更加人为)

于 2011-03-30T10:12:28.107 回答
2

对于像 JMockit 这样的高级模拟框架,私有访问或终结性不是问题。但是,getter/setter 可能在较旧版本的 android 上有一些性能

于 2011-03-30T10:24:42.333 回答
1

一般来说,使用私有字段是有意义的,但也有例外。一个可能的例外是您正在处理数据传输对象 (DTO),并且您希望与客户端清楚地沟通,即设置属性的值不会在后端产生更改。公共领域是一种很好的沟通方式。

于 2011-03-30T10:13:57.257 回答
0

我认为这是一个很好的有效规则,可以确保正确完成信息隐藏——这是 OOP 的一个重要方面。

使用公共 getter 和 setter 方法代替对象可以控制对其状态的更改。

于 2011-03-30T10:13:48.227 回答