嗯,我有一个非常概念性的问题。很多东西看起来像面料,我不知道哪里有很大的好处。 例如
public class MyObject {
public MyObject() {
}
public static MyObject create() {
return new MyObject();
}
public void doSomething(){
// some code...
};
}
从我的观点来看,唯一的好处是对代码的出价较少。在我看来,对性能没有影响。还有其他好处吗?
MyObject myobject = new MyObject();
或
MyObjecct myobject = MyObject.create();
由于
答案 0 :(得分:5)
你说得对,没有明显的性能差异;使用此表单的原因主要是代码的可读性。
通常,如果使用静态创建函数,则会将构造函数声明为私有,从而确保用户只能使用静态函数创建对象
一般来说,我认为静态创建不会增加代码,广告对于普通的日常用品而言,新的可能更清晰,更直接。
但是在某些情况下我认为静态构造函数很有用:
答案 1 :(得分:2)
Joshua Bloch在Effective Java,第2章,项目1中解决了这个问题:考虑静态工厂方法而不是构造函数;这里有几个亮点:
int
参数,但是你可以有两个名为createWithAge(int age)
和createWithHeight(int height)
如您所见,问题几乎与性能无关(重用缓存实例除外),但主要与面向对象设计有关。
免责声明:哎呀,我刚刚看到相同的答案(更好的解释)已经发布了一个不同的问题:https://stackoverflow.com/a/3169644/262683。我的坏......
答案 2 :(得分:1)
我知道你可能需要使用create
:
您必须控制类的每个实例的创建。例如,您计算创建的对象数或以某种方式链接它们,如果实例数达到了您想要的最大抛出异常。
同样factory pattern可能会有趣。
如果您不确定,只需通过new
如果您选择使用create
,您可能希望将构造函数设为私有
答案 3 :(得分:1)
这个问题没有答案。
事实上,这两种模式都是构建适用于特定情况的对象的合法方式。
静态工厂方法在实例控制非常重要的情况下很重要,例如在维护对象缓存或池的系统中。
new运算符很简单,对于为继承而设计的类非常重要。
您在问什么是最佳做法。答案是,最佳实践取决于您的目标,并且对于此类问题,最佳实践是巧妙利用可用工具来实现可扩展和可维护的解决方案。
我建议关闭这个问题。
答案 4 :(得分:0)
这是一个(简单化)Factory Pattern。请查看维基百科条目的适用性部分,了解它的使用位置。
答案 5 :(得分:0)
现在,当你不想要任何其他课程来创建你的课程时,对象然后你让你的类构造函数私有:
private MyObject()
现在任何想要创建类对象的类都必须这样做:
MyObjecct myobject = MyObject.create();
因为现在在其他类MyObject myobject = new MyObject();
内执行此操作会导致编译器错误。