5

假设我有一个类 ObjectInfo,其中包含对象名称和对象类型作为字符串。(我只是为了提出问题而做一些事情。)

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

4 回答 4

3

没有官方标准,但这是我的看法,

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

newInstancecreate暗示您每次都会得到不同的实例。

get意味着如果它存在或null不存在,您将获得一个实例。

在你的情况下newInstance还是create合适的。

参考

Integer.valueOf(1) == Integer.valueOf(1) // you get the same object
Integer.valueOf(-200) != Integer.valueOf(-200) // you get a different object.
于 2012-08-04T08:52:26.220 回答
0

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

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

于 2012-08-04T08:53:36.063 回答
0

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

于 2012-08-04T09:06:22.280 回答
0
 public static ObjectInfo newObjectInfo(String objectName, String objectType)

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

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

您可以在 Guava API中看到这种模式。

于 2012-08-04T09:06:55.837 回答