在valueOf()和newInstance()之间选择的标准是什么?

时间:2012-08-04 08:45:55

标签: java factory-method coding-style

假设我有一个ObjectInfo类,它包含Object name&对象类型为String。(我只是为了提出问题而做点什么。)

class ObjectInfo {
    String objectName;

    String objectType;

    private ObjectInfo(String objectName, String objectType) {
          this.objectName = objectName;
          this.objectType = objectType;
    }
}

如果我想提供一个静态工厂方法来创建这个类的实例,以下两种方法中的哪一种更好&为什么呢?

public static ObjectInfo newInstance(String objectName, String objectType) {
    return new ObjectInfo(objectName, objectType)    
}

public static ObjectInfo valueOf(String objectName, String objectType) {
    return new ObjectInfo(objectName, objectType)    
}

基本上,我想问的是我们何时应该使用valueOf()&什么时候newInstance()?程序员社区中是否有任何约定?

-Ankit

4 个答案:

答案 0 :(得分:3)

没有官方标准,但这是我的意见,

valueOfacquire表示您将获得包含相同信息的任何实例。

newInstancecreate意味着您每次都会获得不同的实例。

get表示如果存在,您将获得一个实例,如果不存在,则为null

在您的情况下,newInstancecreate是合适的。

c.f。

Integer.valueOf(1) == Integer.valueOf(1) // you get the same object
Integer.valueOf(-200) != Integer.valueOf(-200) // you get a different object.

答案 1 :(得分:0)

通常,在java中,当需要某些其他类型数据的字符串表示时,会调用String.valueOf()。在原始包装器(Integer,Double)的情况下,valueOf()接受一个String(“12”)并创建该包装器的实例。

在您的情况下,您尝试使用许多参数创建新对象。这是一种工厂方法。将其称为newInstance更有意义。

答案 2 :(得分:0)

当你说And If I want to provide a static factory method to creating instances of this class时,你回答了自己的问题 新实例在这种情况下是有意义的(即使valueOf和new都做同样的事情)。对我来说,当你想要从现有对象(不一定是整个对象状态)中检索一些有意义的状态信息时,值(如顾名思义)是有意义的,其中new正在创建全新的实例。

答案 3 :(得分:0)

 public static ObjectInfo newObjectInfo(String objectName, String objectType)

对于静态工厂方法,我会使用上面的命名约定。如果方法使用者想要使用静态导入,这很有用:

import static foo.ObjectInfo.newObjectInfo;
//....
ObjectInfo info = newObjectInfo(foo, bar);

您可以看到此模式in the Guava API