ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-12 12:59:22  阅读:185  来源: 互联网

标签:java constructor software-design


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

这两个人主要谈论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,constructor,software-design
来源: https://codeday.me/bug/20190712/1441083.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有