什么是命名静态构造函数方法的首选Java约定

时间:2015-01-28 16:44:51

标签: java

命名静态构造函数方法的首选约定是什么?例如,假设我有一个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方法命名。可能性包括:

  1. valueOf - 一些Java类遵循此类,例如Integer.valueOf,但这只用于拳击原语吗?
  2. of - 更简洁。 Error.of(msg, i)似乎可读。
  3. error - 一些利弊 - 见下文。
  4. create - 过分强调机制(创造某些东西)而不是意图(给我一个值)。例如,某些实现可能会缓存和重用值,这意味着某些内容并不总是实际创建。
  5. createError - 罗嗦,与create相同的问题。
  6. 我倾向于以函数式编写代码,并且可能因此我的偏好是#3,部分原因是如果我静态导入Error那么我可以简单地将其称为error(msg, i),看似可读并模仿实际的构造函数用法。但是,它可能会导致与同名的局部变量混淆。例如,error = error(msg, i);看起来很混乱。

    我有兴趣看到支持特定方法的证据或论据,而不是简单的"我喜欢xxx"答案。

4 个答案:

答案 0 :(得分:4)

如果最近添加的JDK是一个很好的指示,那么你可以看一下java.time

  

API的数量表面积相对较大   方法。通过使用一致的方法使其易于管理   前缀。

     
      
  • of - 静态工厂方法
  •   
  • parse - 专注于解析的静态工厂方法
  •   
  • [...]
  •   

of看起来像是一个合理的候选用户,但可能比选择更重要的是一致性。

答案 1 :(得分:2)

在“Effective Java”中,除了你已经提到的“valueOf”和“of of”之外,Joshua Bloch提出以下建议:

  1. <强>的getInstance

  2. <强>的newInstance

  3. 获取类型(即getError)

  4. 类型(即newError)

答案 2 :(得分:1)

一个好名字是newError(...)。它表明这个班级本身也是一个工厂。

答案 3 :(得分:0)

当工厂方法使用某种缓存时,可以使用

valueOfof,这样方法调用就不必创建新实例。

newClassNamecreateClassName用于一般工厂方法,它始终尝试创建实例。