【问题标题】:Create new object of class or use static method?创建类的新对象或使用静态方法?
【发布时间】:2015-06-29 18:09:03
【问题描述】:

我有一个由 3 个类组成的简单程序。 GUI、驱动程序和主程序。

主类:

public static void main(String[] args){
GUI theGUI = new GUI();
}

GUI类:

public void makeGUI(){
final GUI guiInstance = new GUI();
//some other code here
}

我可以将 makeGUI() 方法设为静态,而不是创建两个对象,这样我就可以避免创建一个不必要的对象吗?我知道对于这种规模的程序,性能并不重要,但是尝试避免不必要的对象是一种好的编程习惯吗?

【问题讨论】:

  • 是的。这就是所谓的工厂方法,它是合理和普遍的。 (Guava 的大部分对象都使用它)。
  • 做不必要的对象肯定不好。从您的代码中,很难看出那些不必要的对象是什么

标签: java class object methods


【解决方案1】:

这里有两种主要的模式可以帮助你。第一个是singleton,对于您正在做的事情来说,这可能是最直接的。这个想法是您只创建每个对象一次,然后使用静态方法来获取对象。在您的示例中,GUI 类可能如下所示:

public class GUI{
    private static final GUI instance = new GUI();

    //Make constructor private so that no one can create an instance
    private GUI(){}

    public GUI getInstance(){
        return instance();
    }

    ... other code
}

还有其他方法可以创建单例,但这可能是最简单的。

另一种模式称为factory 模式。这类似于单例,但可以让您更好地控制实例的数量以及实例的创建方式。对于您正在做的事情,这可能是矫枉过正。

当您真的想走保持实例关闭的道路并拥有更多灵活性时,您想开始研究Dependency injection 和诸如spring 之类的框架。

【讨论】:

    【解决方案2】:

    有趣的是,这个小问题实际上有很多大的解决方案,具体取决于上下文。您处理的应用程序越大,这个问题就越大。特别是当您进入单元测试和交换实现时。基本上你的代码不会有很多new 调用。

    这可以通过以下按复杂度增加的顺序来解决...

    1) 工厂方法。 example

    2) 建设者。 example

    3) 单例。 example

    4) 依赖注入或控制反转。 example

    5) 服务定位器。 example

    6) 网络服务。当您可以使用服务时,为什么要创建一个新对象。 example

    【讨论】:

    • @Alan 谢谢。更新了指向更好示例的新链接。
    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2011-08-03
    • 2018-12-19
    • 1970-01-01
    相关资源
    最近更新 更多