所以,我想说我有这样的原型:
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
的参数。我想在克隆对象中使用该名称,但我怎么能这样做?
答案 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!
}
}