0

所以假设我有这样的原型:

private static Hashtable<String, Furniture> map  = 
                        new Hashtable<String, Furniture>();

public My_product() {
    loadCache();
}

public My_Product createProduct(String type, String name) {
    Furniture cachedproduct = map.get(type);
    return  (Furniture) cachedproduct.clone();
}

private static void loadCache() {
    Sub_product1 pr1 = new Sub_product1(null);
    map.put("pr1", pr1);
    Sub_product2 pr2 = new Sub_product2(null);
    map.put("pr2", pr2);
}   

所以当我创建一个对象的实例时,我不知道克隆它后会输入什么值(使用克隆创建对象)。所以我为对象实例选择了空值。但是当我克隆它时,我知道需要为该对象分配什么值。那么我如何在克隆时指定一些值而不是null来自对象实例的值呢?

正如您在方法createProduct方法中看到的那样,有一个名为 的参数name。我希望在克隆对象中使用该名称,但我该怎么做呢?

4

2 回答 2

1

你可以使用setter方法吗?

public My_Product createProduct(String type, String name) {
    Furniture cachedproduct = map.get(type);
    Furniture clonedProduct = (Furniture) cachedproduct.clone();
    clonedProduct.setType(type);
    clonedProduct.setName(name);
    return clonedProduct;
}

但是,我仍然不清楚从地图中克隆缓存对象的整个想法。您的产品实例化非常昂贵吗?有什么诀窍?

于 2013-10-10T15:12:26.260 回答
0

您不能通过 Java 内置的克隆机制传递参数。您可以在类上提供一个 setter 以Furniture在克隆后更改名称。

请注意,Java 中的克隆通常被认为是损坏的。这是一种创建对象的简单方法。一般来说,你最好使用工厂模式,例如:

interface FurnitureBuilder {
   Furniture build(String name);
}

class SubProduct1Builder implements FurnitureBuilder {
   public Furniture build(String name) { return new SubProduct1(name); }
}

class MyFurnitureFactory {
    private final Map<String, FurnitureBuilder> builderByType = ... 
    // initialization omitted

    public Furniture create(String type, String name) {
       return builderByType.get(type).build(name); // null check omitted!
    }
}
于 2013-10-10T15:13:23.860 回答