mainメソッドから呼んでいるのでstaticついてますが一応こんな感じでいけます。
public static void main(String[] args) {
Item p = new Pencil();
Item copy = new Machine().copy(p);
System.out.println(copy.getClass().getSimpleName());
}
public static abstract class Item {
abstract Item copy();
}
public static class Pencil extends Item {
Pencil copy() {
return new Pencil();
}
}
public static class Eraser extends Item {
Eraser copy() {
return new Eraser();
}
}
public static class Ruler extends Item {
Ruler copy() {
return new Ruler();
}
}
public static class Machine {
public Item reproduct(Item i) {
return i.copy();
}
}
-
Item
クラスに抽象メソッドとして、インスタンスを新規で作成するメソッドを追加する
- 各クラスで上記のメソッドの実装を行う
このへんも書きたくないとなると、リフレクションというものを使う他ないと思います。
Pencil copy() {
return new Pencil();
}
リフレクションを使ったサンプル
public static void main(String[] args) throws Exception {
Item p = new Pencil();
Item copy = new Machine().copy(p);
System.out.println(copy.getClass().getSimpleName());
}
public static abstract class Item {
}
public static class Pencil extends Item {
}
public static class Eraser extends Item {
}
public static class Ruler extends Item {
}
public static class Machine {
public Item reproduct(Item i) throws Exception {
return i.getClass().getDeclaredConstructor().newInstance();
}
}
ただし、リフレクションはどこから何が呼ばれているのかわかりにくくなるため、あまり使わないほうが良いです。