在java中创建昂贵的对象

时间:2015-10-09 19:19:26

标签: java performance object constructor

我想用以下属性创建一个名为A的对象。

public  class A {

    private Object data;

    public A(Object data) {
        this.data = data;
    }

}

如何设置此对象,以便如果两个实例具有相同的数据值,那么它们会引用相同的实例?我正在创建一个非常昂贵的对象,不需要重复。

2 个答案:

答案 0 :(得分:3)

您想要的是实例控件:您希望以受控方式创建实例。

您可以使用工厂模式实现此目的。拥有一个工厂,它保留唯一值的缓存,映射到昂贵的对象。使用除工厂之外的任何其他方法禁用对象创建。当从工厂请求实例时,检查它是否在缓存中,如果是,则返回它。否则,创建一个新对象,将其放入缓存中并返回它。这是一般的想法。

答案 1 :(得分:1)

如果Object data是更细粒度的组合,您可以结合使用 有工厂的Flyweight pattern。 @Janos已经描述了工厂和缓存机制,所以这里有一个关于如何一起使用它们的简要教程:

Flyweight Pattern in Java Tutorial(请完整阅读该文章)

  

当我们需要创建很多时,使用Flyweight设计模式   一类的对象。由于每个对象都占用了可以的内存空间   对于低内存设备至关重要,例如移动设备或嵌入式设备   系统,可以应用flyweight设计模式来减少负载   通过共享对象来记忆

     
      
  • 应用程序要创建的对象数量应该很大。
  •   
  • 对象创建对内存很重要,也很耗时。
  •   
  • 对象属性可以分为内在属性和外在属性,对象的外在属性应该是   由客户端程序定义。
  •   
     

...客户端程序将使用flyweight工厂来实例化Object,因此我们需要在工厂中保留一个客户端应用程序无法访问的Objects映射。每当客户端程序调用获取Object的实例时,它应该从HashMap返回,如果没有找到,则创建一个新的Object并放入Map然后返回它。我们需要确保在创建Object时考虑所有内在属性。