Java 可访问数据的约定。 (Public 访问器 & Getters/Naming)

Java conventions for accessible data. (Public accessors & Getters/Naming)

通过 Java API,您看到许多冲突的命名和做法,这让我很困惑。

例如:

String class 有一个名为 count 的私有变量(整数),用于跟踪字符串的大小,但这是 return由名字为 length() 的 getter 编辑。

如果你转到任何类型的数组,而不是使用 getter 长度方法,它们只是通过 public 访问器传递变量,它可以通过 arrayInstance.length.

回到字符串 class 我们有 String#getBytes() 方法,它是一个 getter,类似于 length() getter,但是执行略微获取更多逻辑和 return 值。

就我个人而言,创建一个前缀为 get 的 getter 似乎是多余的,例如我宁愿输入 GamePacket#data() 而不是 GamePacket#getData() 但是我觉得在那里这个命名背后可能有更深层次的含义,而不仅仅是不一致。

此外,为什么 Array[] 不为 length 使用 getter?

有人愿意为我解释一下吗?

命名约定似乎在整个 Java 代码库中有所不同,但一个早期的标准是 JavaBeans 命名约定;这基本上形成了 Java 缺乏真实属性的命名解决方案。

Object/primitive getter 的形式为 getXXX(),布尔值除外,其首选形式为 isXXX()。设置器始终采用 setXXX().

的形式

从这一点出发,编写了数百万行反射代码。

这个约定早于注释,在编写类似这种伪代码时,注释本来是增加意图和增加冗长之间的权衡

@Setter
void data(Data data) {
    this.data = data;
};

@Getter
Data data() {
    return data;
};

Getter(和 setter)来自 Java Bean 规范。使用它们的原因有很多:

  • 大多数 Java 开发人员希望访问器被这样命名
  • API遵守这些约定更容易发现。例如,在我的 IDE 中,我会经常按 get CtrlSpace 来发现所有对象中可用的信息。
  • 许多 APIs 和框架依赖于这些约定来工作:JSP EL,从请求参数填充 bean 的 MVC 框架,JPA,像 Spring 这样的依赖注入框架,等等.

通常 命名 getter 的方式与保存信息的私有变量相同,但重要的是封装和 public API,所以没有什么能阻止您计算 getter 中的值,或者以不同的方式命名私有字段。

这不会是一个完整的答案,因为真正的答案可能需要采访 Java 的原始开发者或以其他方式研究历史记录。但这里有一些注意事项:

  • 如评论中所述,数组的 length 字段为 final,因此无法设置。
  • 数组和 String class 都是在 Java 的最早版本中设计的,在 getters 和 setters 的约定之前安定下来。 get... is...set... 约定只是在引入 JavaBeans 时才真正确定下来。更改 API 会使旧代码停止工作,因此旧名称仍然存在。
  • 通常(例如 classes 不是 JavaBeans),实际上没有规则说 getter 和 setter 方法必须反映class 中任何特定字段的名称。访问器方法的整体思想是它们隐藏了实现,所以它们背后的任何东西都可以是一个字段、字段的组合或其他东西。