如何在克隆对象中使用参数?

时间:2013-10-10 14:54:00

标签: java arguments clone

所以,我想说我有这样的原型:

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值。但是当我克隆它时,我知道需要为该对象分配什么值。那么我如何指定克隆时从对象实例中添加一些值而不是null一个?

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

2 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:0)

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

请注意,Java中的克隆通常被认为是破坏的。这是一种创建对象的脆弱方法。通常,您最好使用 factory 模式,例如类似的东西:

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!
    }
}