java – 何时使用getInstanceOf而不是构造函数

几个月前,我参加了由两位独立软件开发公司代表主持的演讲.它主要是关于良好的软件设计和实践.

这两个人主要谈论Java,我记得他们说,在某些情况下,使用getInstanceOf()而不是构造函数是一个很好的做法.它与总是从不同的类而不是构造函数调用getInstanceOf()有关,它是如何在更大规模的项目上更好的方法.

正如你所看到的,我现在记不起来了:/但我记得他们使用的论据确实令人信服.我想知道你们有没有遇到过这样的设计,你知道它什么时候有用吗?或者你认为它根本不存在?

最佳答案
他们可能正在讨论静态工厂方法模式(而不是用于动态创建对象的反射API方法).

在构造函数上使用getInstanceOf()方法和使用new方法有几个优点.静态工厂方法可以……

>如果在某些情况下需要(基于环境条件,例如属性和其他对象/单例或方法参数),则选择创建主类的不同子类.
>选择返回现有对象而不是创建对象.有关此示例,请参阅Java API中的Boolean.valueOf(boolean).
>做与构造函数相同的事情 – 只返回类本身的新实例.
>提供许多不同类型的方法来构造一个新对象并命名这些方法,以便它们不那么混乱(例如,尝试使用构造函数,很快就会有很多不同的重载).有时,如果您需要能够以两种不同的方式创建实例但只需要相同类型的参数,那么构建器甚至无法实现这一点.例:

// This class will not compile!
public class MyClass {
    public MyClass(String name, int max) {
        //init here
    }
    public MyClass(String name, int age) {
        // init here
    }
}

// This class will compile.
public class MyClass2 {
    private MyClass2() {
    }
    public static MyClass2 getInstanceOfMax(String name, int max) {
        MyClass2 m2 = new MyClass2();
        // init here
        return m2;
    }
    public static MyClass2 getInstanceOfAge(String name, int age) {
        MyClass2 m2 = new MyClass2();
        // init here
        return m2;
    }
}

>做上述任何组合.
>并且,最重要的是它隐藏了从其他类实例化实例的细节,因此将来可以改变(构造封装).

构造函数只能创建所请求的确切类型的对象的新实例.以后不能改变.

这种模式的一些缺点是:

>工厂方法是静态的,因此不能在子类中继承;子类很容易访问父构造函数.
>工厂方法名称可能有很大差异,这可能会让一些(新)开发人员感到困惑.

你还要求个人经历.是的,我经常使用这两种模式.对于大多数类构造函数,但是当有更多高级需求时,我使用静态工厂.我还从事其他语言的项目(专有,但类似于Java),这种形式的构造是强制性的.

转载注明原文:java – 何时使用getInstanceOf而不是构造函数 - 代码日志