"is"变量的getter/setter在POJO类中的正确语法是什么?

15
如果一个类包含一个名为"blah"的变量,那么标准的getter/setter语法显然是getBlah()和setBlah()。但如果我有一个POJO类,其中一个变量名为isBlah,我应该使用:

如果一个类中包含一个名为“blah”的变量,则标准的getter/setter语法显然是getBlah()和setBlah()。但是,如果我的POJO类中有一个名为isBlah的变量,我该使用:

public type getIsBlah() {
  return isBlah;
}

public setIsBlah(type isBlah) {
  this.isBlah = isBlah;
}

还是这个吗?

public type isBlah() {
  return isBlah;
}

public setBlah(type blah) {
  this.isBlah = blah;
}

第一种语法似乎更严格地符合POJO约定,但如果我要求IntelliJ生成一个类的getter/setter,它会生成第二种类型(嘿,IntelliJ从来没有让我失望过:])。那么哪种语法是首选?

7个回答

20

使用属性的一个原因是将API与实现解耦。换句话说,您不应该感到被私有变量的命名所约束。除了尽可能保持可读性以便于代码维护者,变量名不应该影响命名。

如果在这种情况下"类型"是boolean,那么第二种形式是正确的。如果它不是boolean,则应该使用getXXX - 但我可能不会使用getIsXXX。对我来说,“is”与布尔属性有非常强的对应关系,在其他上下文中使用它不仅会违反JavaBeans约定(这可能会影响其他工具),而且在我看来会产生误导。


5
@Vincent: 我猜你的意思是“+1因为提到它会违反JavaBeans的约定”,而不是“+1-成为一个违反约定的人!” :) - Jon Skeet

4
请注意,字段的名称与JavaBean规范完全无关。只有getter/setter的名称是相关的。
通常getter的名称为get<PropertyName>()。仅对于boolean属性,is<PropertyName>()作为替代方式也是允许的。
请注意,在您的示例中,当您调用getter isBlah()时,Bean属性名称为“Blah”,而在调用getter getIsBlah()时,其名称为“IsBlah”。
个人而言,我通常更喜欢使用isBlah()

3

不会说有关普通Java对象(POJO)的严格规定,但是对于JavaBean而言,第二个(IntelliJ)示例是布尔属性的标准,其他所有内容使用getX


3

使用“is”语法存在一个大问题,如果你使用JSTL,那么JSTL EL将无法识别它们。这很愚蠢,但JSTL EL的设计者没有花时间检查他们的逻辑是否符合JavaBeans的规范。

我经常在视图层类中编写getIsBlah()方法,以调用isBlah()方法,只是为了给JSTL提供一个钩子。这很糟糕。


1
最新的JSTL是否仍存在此问题? - Adeel Ansari
我相信是这样的,虽然这更多是与JSP EL有关而不是JSTL本身的问题。 - skaffman
我非常确定那不再是事实。 - harmanjd

2
我会选择第二个选项。第一个选项中的getIsBlah()似乎过于冗长和多余。

1

其实,“get”和“is”都是可以的,因为它们在JavaBeans规范下仍然被接受。我建议根据你的“Blah”究竟是什么词语来选择更好或者更自然的那个。


0

JSTL只允许isMyBool是布尔类型,而不是Boolean或任何其他对象,根据bean规范(原始类型与对象类型)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接