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 中任何特定字段的名称。访问器方法的整体思想是它们隐藏了实现,所以它们背后的任何东西都可以是一个字段、字段的组合或其他东西。
通过 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 中任何特定字段的名称。访问器方法的整体思想是它们隐藏了实现,所以它们背后的任何东西都可以是一个字段、字段的组合或其他东西。