如何根据接口实现创建新对象
How to create a new object based on interface implementation
首先,我认为我的问题措辞不当,但我真的不明白如何措辞。
我有一个起始界面,许多 classes 正在实施该界面。我想做的是看看是否有一种方法可以创建一个新对象,以便我被传递给通用接口,然后基于方法 .getClass().getSimpleName(),创建一个基于该字符串的新对象.
是创建 switch case 语句的唯一方法吗?由于实现的数量class太多了(大概100个左右)。
参考代码:
public interface MyInterface {
public void someMethod();
}
然后我将实施 classes:
public class MyClass1 implements MyInterface {
public void someMethod() { //statements }
}
public class MyClass2 implements MyInterface {
public void someMethod() { //statements }
}
public class MyClass3 implements MyInterface {
public void someMethod() { //statements }
}
我最后想要的是另一个 class,它传递了一个 MyInterface 类型的参数,从中获取简单名称并根据该简单名称创建一个新的 MyClassX 实例。
public class AnotherClass {
public void someMethod(MyInterface interface) {
if (interface == null) {
System.err.println("Invalid reference!");
System.exit(-1);
} else {
String interfaceName = interface.getClass().getSimpleName();
/**
* This is where my problem is!
*/
MyInterface newInterface = new <interfaceName> // where interfaceName would be MyClass1 or 2 or 3...
}
}
}
非常感谢任何帮助!
您可以为此使用反射:
public void someMethod(MyInterface myInterface) {
Class<MyInterface> cl = myInterface.getClass();
MyInteface realImplementationObject = cl.newInstance(); // handle exceptions in try/catch block
}
这是许多解决方案的常见问题。当我面对它时,我从不使用反射,因为如果它是一个大项目的一部分很难维护。
当您必须根据用户选择构建对象时,通常会出现此问题。您可以为此尝试使用 Decorator
模式。因此,不是为每个选项构建不同的对象。您可以构建单个对象,根据选择添加功能。例如:
// you have
Pizza defaultPizza = new BoringPizza();
// user add some ingredients
Pizza commonPizza = new WithCheese(defaultPizza);
// more interesting pizza
Pizza myFavorite = new WithMushroom(commonPizza);
// and so on ...
// then, when the user checks the ingredients, he will see what he ordered:
pizza.ingredients();
// this should show cheese, mushroom, etc.
引擎盖下:
class WithMushroom implements Pizza {
private final Pizza decorated;
public WithMushroom(Pizza decorated) {
this.decorated = decorated;
}
@Override
public Lizt<String> ingredients() {
List<String> pizzaIngredients = this.decorated.ingredients();
// add the new ingredient
pizzaIngredients.add("Mushroom");
// return the ingredients with the new one
return pizzaIngredients;
}
}
重点是您没有为每个选项创建一个对象。相反,您创建具有所需功能的单个对象。每个装饰器都封装了一个功能。
首先,我认为我的问题措辞不当,但我真的不明白如何措辞。
我有一个起始界面,许多 classes 正在实施该界面。我想做的是看看是否有一种方法可以创建一个新对象,以便我被传递给通用接口,然后基于方法 .getClass().getSimpleName(),创建一个基于该字符串的新对象.
是创建 switch case 语句的唯一方法吗?由于实现的数量class太多了(大概100个左右)。
参考代码:
public interface MyInterface {
public void someMethod();
}
然后我将实施 classes:
public class MyClass1 implements MyInterface {
public void someMethod() { //statements }
}
public class MyClass2 implements MyInterface {
public void someMethod() { //statements }
}
public class MyClass3 implements MyInterface {
public void someMethod() { //statements }
}
我最后想要的是另一个 class,它传递了一个 MyInterface 类型的参数,从中获取简单名称并根据该简单名称创建一个新的 MyClassX 实例。
public class AnotherClass {
public void someMethod(MyInterface interface) {
if (interface == null) {
System.err.println("Invalid reference!");
System.exit(-1);
} else {
String interfaceName = interface.getClass().getSimpleName();
/**
* This is where my problem is!
*/
MyInterface newInterface = new <interfaceName> // where interfaceName would be MyClass1 or 2 or 3...
}
}
}
非常感谢任何帮助!
您可以为此使用反射:
public void someMethod(MyInterface myInterface) {
Class<MyInterface> cl = myInterface.getClass();
MyInteface realImplementationObject = cl.newInstance(); // handle exceptions in try/catch block
}
这是许多解决方案的常见问题。当我面对它时,我从不使用反射,因为如果它是一个大项目的一部分很难维护。
当您必须根据用户选择构建对象时,通常会出现此问题。您可以为此尝试使用 Decorator
模式。因此,不是为每个选项构建不同的对象。您可以构建单个对象,根据选择添加功能。例如:
// you have
Pizza defaultPizza = new BoringPizza();
// user add some ingredients
Pizza commonPizza = new WithCheese(defaultPizza);
// more interesting pizza
Pizza myFavorite = new WithMushroom(commonPizza);
// and so on ...
// then, when the user checks the ingredients, he will see what he ordered:
pizza.ingredients();
// this should show cheese, mushroom, etc.
引擎盖下:
class WithMushroom implements Pizza {
private final Pizza decorated;
public WithMushroom(Pizza decorated) {
this.decorated = decorated;
}
@Override
public Lizt<String> ingredients() {
List<String> pizzaIngredients = this.decorated.ingredients();
// add the new ingredient
pizzaIngredients.add("Mushroom");
// return the ingredients with the new one
return pizzaIngredients;
}
}
重点是您没有为每个选项创建一个对象。相反,您创建具有所需功能的单个对象。每个装饰器都封装了一个功能。