命名静态构造函数方法的首选约定是什么?例如,假设我有一个Error
类,它有一个构造函数,它只是初始化字段,然后是一些静态构造函数方法:
class Error {
static Error xxxx(String msg) {
return new Error(msg, -1);
}
static Error xxxx(String msg, int line) {
return new Error(msg, line);
}
final String msg;
final int line;
private Error(String msg, int line) {
this.msg = msg;
this.line = line
}
}
我应该为xxxx
方法命名。可能性包括:
valueOf
- 一些Java类遵循此类,例如Integer.valueOf
,但这只用于拳击原语吗?of
- 更简洁。 Error.of(msg, i)
似乎可读。error
- 一些利弊 - 见下文。create
- 过分强调机制(创造某些东西)而不是意图(给我一个值)。例如,某些实现可能会缓存和重用值,这意味着某些内容并不总是实际创建。createError
- 罗嗦,与create
相同的问题。我倾向于以函数式编写代码,并且可能因此我的偏好是#3,部分原因是如果我静态导入Error
那么我可以简单地将其称为error(msg, i)
,看似可读并模仿实际的构造函数用法。但是,它可能会导致与同名的局部变量混淆。例如,error = error(msg, i);
看起来很混乱。
我有兴趣看到支持特定方法的证据或论据,而不是简单的"我喜欢xxx"答案。
答案 0 :(得分:4)
如果最近添加的JDK是一个很好的指示,那么你可以看一下java.time:
API的数量表面积相对较大 方法。通过使用一致的方法使其易于管理 前缀。
of
- 静态工厂方法parse
- 专注于解析的静态工厂方法- [...]
of
看起来像是一个合理的候选用户,但可能比选择更重要的是一致性。
答案 1 :(得分:2)
在“Effective Java”中,除了你已经提到的“valueOf”和“of of”之外,Joshua Bloch提出以下建议:
<强>的getInstance 强>
<强>的newInstance 强>
获取类型(即getError)
新类型(即newError)
答案 2 :(得分:1)
一个好名字是newError(...)
。它表明这个班级本身也是一个工厂。
答案 3 :(得分:0)
valueOf
和of
,这样方法调用就不必创建新实例。
newClassName
或createClassName
用于一般工厂方法,它始终尝试创建实例。