我讀過你可以使用類對象,而不是使用克隆原型。但我不明白使用類對象而不是那個是什麼意思?任何人都可以舉一個例子,如果有人明白什麼意思使用類對象,而不是原型模式?Java - 使用類對象而不是原型?
-1
A
回答
1
從Java 5開始,java.lang.Class
在其自身類型上是通用的。這允許該類以類型安全的方式創建它的實例。
當您使用克隆原型,你做這樣的事情:
interface Calculator {
void setA(int a);
void setB(int b);
int compute();
Calculator copy();
}
class Adder implements Calculator {
private int a,b;
public void setA(int a) {this.a=a;}
public void setB(int b) {this.b=b;}
public int compute() {return a+b;}
public Calculator copy() {
Adder res = new Adder();
res.a = a;
res.b = b;
return res;
}
}
class Multiplier implements Calculator {
private int a,b;
public void setA(int a) {this.a=a;}
public void setB(int b) {this.b=b;}
public int compute() {return a*b;}
public Calculator copy() {
Multiplier res = new Multiplier();
res.a = a;
res.b = b;
return res;
}
}
class Test {
static void computeWithPrototype(Calculator proto) {
Calculator calc = proto.copy();
calc.setA(123);
calc.setB(321);
System.out.println(calc.compute());
}
public static void main(String[] args) throws Exception {
computeWithPrototype(new Adder());
computeWithPrototype(new Multiplier());
}
}
Demo of the above approach on ideone。
你可以用一個Class<T>
代替copy
方法,像這樣重新寫:
interface Calculator {
void setA(int a);
void setB(int b);
int compute();
}
class Adder implements Calculator {
private int a,b;
public void setA(int a) {this.a=a;}
public void setB(int b) {this.b=b;}
public int compute() {return a+b;}
}
class Multiplier implements Calculator {
private int a,b;
public void setA(int a) {this.a=a;}
public void setB(int b) {this.b=b;}
public int compute() {return a*b;}
}
class Test {
static <T extends Calculator> void computeWithClass(Class<T> calcClass)
throws Exception {
Calculator calc = calcClass.newInstance();
calc.setA(123);
calc.setB(321);
System.out.println(calc.compute());
}
public static void main(String[] args) throws Exception {
computeWithClass(Adder.class);
computeWithClass(Multiplier.class);
}
}
0
在java中,當你創建一個對象時,它有一個引用存儲器。所以當你試圖將這個對象分配給一個變量時,你傳遞了一個參考內存。
例子:
Person a = new Person(); a.setName("Person abc");
Person b = a; b.setName("Person yzw");
System.out.print(a.getName());
System.out.print(b.getName());
出於這個原因,當你修改屬於這個內存引用您修改既有屬性。 它打印:「yzw yzw」;
所以,如果你不希望它發生,所以使用Cloneable接口:
public class Person implements Cloneable{
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
所以,當你調用clone()方法,你將有兩個不同的對象。 實施例:
Person a = new Person();
a.setName("Person abc");
Person b = (Person)a.clone();
System.out.print(a.getName());
System.out.print(b.getName());
它付印: 「ABC YZW」;
相關問題
- 1. 優點/不使用原型鏈和返回對象,而不是
- 2. 爲什麼使用Javascript對象,而不是原型
- 3. 對事件使用對象類型而不是實際類型的原因是什麼?
- 4. 對原型類使用對象文字
- 5. 使用對象,而不是泛型
- 6. 地方對象類而不是泛型
- 7. 對象或原始類型
- 8. 參數對象的類型[類型]不是原始的
- 9. 如何使用對象而不是匿名類型
- 10. 使用Java創建原始類型/對象反射
- 11. Java在不同的對象中使用泛型類對象
- 12. pandas.read_sql返回系列對象類型而不是sql類型
- 13. COM對象 - 陣列作爲對象,而不是類型
- 14. JavaScript對象原型類型錯誤:...是不確定的
- 15. 使用Java進行原型製作而不是擴展
- 16. 在類上使用XmlSerializer時遇到問題:對象類型不是原始的
- 17. 不同類型的Java通用對象。
- 18. 成語只獲取「自己的對象」而不是原型鏈
- 19. IllegalArgumentException:對象不是類的類型org.eclipse.jetty.plus.jndi.Resource
- 20. Json.NET原始類型 - 使用Decimal而不是Double
- 21. 找出對象是類對象而不是類的實例
- 22. 不使用抽象類而不使用接口的原因?
- 23. 傳遞一個抽象類而不是java中的對象?
- 24. 執行功能的對象類型,而不是使用if else else else
- 25. 當在Java中調用對象類型而不是對象的方法時,尤其是在靜態綁定中?
- 26. jqGrid用戶數據與數值類型,而不是對象
- 27. 返回類的類型,而不是一個對象
- 28. 原型對象是原爲String
- 29. 使用原型對對象排序
- 30. 解析類型而不創建對象
,我們談論的Java或JavaScript在這裏? –
這個問題還不清楚。請澄清。 –
你有鏈接到你閱讀的文章嗎?原型創建是創建對象層次結構時的一種解決方案,相關操作既昂貴又不可行。舉一個遊戲狀態的例子 - 讓我們假設你玩了2個小時並且保存了狀態。恢復時,克隆以前保存的狀態要比運行所有2小時的操作更容易。因此,提及您閱讀的內容可能會幫助您獲得更好的答案。 –