2013-10-10 21 views
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。我希望這個名字用於克隆對象,但我怎麼能這樣做?

回答

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

但是,我仍然不清楚從地圖上克隆緩存對象的整個想法。您的產品實例化非常昂貴嗎?有什麼訣竅?

+0

謝謝。有用。那麼我讀到克隆不好,但我需要測試它的工作原理。 – Andrius

0

您無法通過Java內置克隆機制傳遞參數。您可以在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! 
    } 
}