以"get"和"set"开头的Java非属性访问器方法?

HDa*_*ave 1 java properties naming-conventions

在开创性的书籍The Java of Java Style中,它说:

遵循JavaBeans约定来命名属性访问器方法.JavaBeans规范为可以访问JavaBean实现的属性的方法建立标准命名约定.在任何类中命名方法时,无论是否实现Bean,都应该应用这些约定.

is/get/set在创建简单(无副作用)属性访问器时,我们的项目遵循此规则.但我的问题是 - 用get和set启动其他方法是否令人困惑?

例如,假设我有一个方法调用外部系统来获取全局序列中的下一个数字.命名这种方法getNextId()被认为是不好的做法吗?

我会这么认为,因为它让我认为nextId是序列对象的属性,而实际上并非如此.我认为一个更好的名字将是nextId()fetchNextIdFromExternalSystem().

这里的最佳做法是什么? is/get/set限于财产存取者?

Jer*_*vel 6

Getters不必专门映射到支持字段.他们只需按照他们所说的去做:返回一个以某种方式包含在该类中的值.

这没有说明存储该值的方式.这可以直接通过支持字段,也可以通过集合中的查找,或者甚至可以在幕后将其外包给某种数据提供者.

所有这些都是封装的另一个方面.它屏蔽了外部世界价值的内在表现.

使用它的任何人都清楚该方法的作用:它返回下一个ID.如何确定此ID对于调用者来说是没有用的,并且他不关心它是作为特定字段保存还是需要在某处查找.

您检索一个值.调用者不关心如何存储它,他只是想要值.getNextId()是一个可接受的名字.

很难找到一个简单的官方指南,但我相信它有点是Java命名约定JavaBean约定的组合.

进一步来说:

方法

方法应该是动词,在第一个字母小写的大小写混合的情况下,每个内部单词的首字母大写.

run(); runFast(); getBackground();

如果bean具有遵循这些模式的访问器方法,则bean定义类型为T的属性p

消气

public T getP()

它没有指定是否应该专门映射到一个支持字段,它只是确定它应该如何构造.通过命名方法,nextID()我看到两个问题:

  1. "使用动词"的准则并不受尊重
  2. 存在歧义:我们是否想获得下一个ID,或者它是否应该以某种方式排列下一个ID?

我意识到你不应该只从一个库中获取指南并在下一个应用它,但我不能说我到目前为止已经看到它做了不同的事情,并且使用get -prefix 确实很有意义.