假设我有一个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
答案 0 :(得分:3)
没有官方标准,但这是我的意见,
valueOf
或acquire
表示您将获得包含相同信息的任何实例。
newInstance
或create
意味着您每次都会获得不同的实例。
get
表示如果存在,您将获得一个实例,如果不存在,则为null
。
在您的情况下,newInstance
或create
是合适的。
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。