在 java 中使用泛型创建实例而不是反射
Using generic type to create instance instead of reflection in java
我的代码如下所示:
public class Person{
private Configuration configuration;
public void act(){
final Action action = new Factory().createAction(configuration);
....
}
}
public class Factory{
public Action createAction(Configuration configuration){
Constructor<? extends Action> constructor =
configuration.getActionClass.
getConstructor(configuration.getClass());
return constructor.newInstance(configuration);
}
}
public class Configuration{
private Class<? extends Action> actionClass;
public void setActionClass(Class<? extend Action> cls){
this.actionClass = cls;
}
public Class<? extends Action> getActionClass(){
return this.actionClass;
}
}
每次调用 act()
时,都会出于某种原因创建一个新的 Action 实例。我需要继承 Action
并将其传递给 act()
.
所以我在工厂方法上使用反射来实现这一点。但这似乎有点矫枉过正而且不安全。
是否可以使用类型安全的方法(例如泛型)来替换反射?
由于类型擦除(参见 #1),如果您想在运行时实例化一个类型,则无法避免反射和 Class<?>
参数,因此回答您的问题可能有点矫枉过正但是 new T();
是不可能的。
不过,您可以通过向 Configuration
class.
添加泛型类型参数来使其类型安全
public class Configuration<T extends Action> {
private Class<T> actionClass;
public void setActionClass(Class<T> cls){
this.actionClass = cls;
}
public Class<T> getActionClass(){
return this.actionClass;
}
}
并删除对它的所有 raw 引用。 (即,将 Configuration
切换到 Configuration<T>
任何使用的地方)
我使用 Java 8 的新功能从朋友那里得到了一个非常巧妙的解决方案。
public class Person{
private Configuration configuration;
public void act(){
final Action action = configuration.getActionFactory().apply(configuration);
....
}
}
public class Configuration{
private Function<Configuration, Action> actionFactory = Action::new;
public void setActionFactory(Function<Configuration, Action> actionFactory){
this.actionFactory = actionFactory;
}
public Function<Configuration, Action> actionFactory getActionFactory(){
return this.actionFactory;
}
}
我的代码如下所示:
public class Person{
private Configuration configuration;
public void act(){
final Action action = new Factory().createAction(configuration);
....
}
}
public class Factory{
public Action createAction(Configuration configuration){
Constructor<? extends Action> constructor =
configuration.getActionClass.
getConstructor(configuration.getClass());
return constructor.newInstance(configuration);
}
}
public class Configuration{
private Class<? extends Action> actionClass;
public void setActionClass(Class<? extend Action> cls){
this.actionClass = cls;
}
public Class<? extends Action> getActionClass(){
return this.actionClass;
}
}
每次调用 act()
时,都会出于某种原因创建一个新的 Action 实例。我需要继承 Action
并将其传递给 act()
.
所以我在工厂方法上使用反射来实现这一点。但这似乎有点矫枉过正而且不安全。
是否可以使用类型安全的方法(例如泛型)来替换反射?
由于类型擦除(参见 #1),如果您想在运行时实例化一个类型,则无法避免反射和 Class<?>
参数,因此回答您的问题可能有点矫枉过正但是 new T();
是不可能的。
不过,您可以通过向 Configuration
class.
public class Configuration<T extends Action> {
private Class<T> actionClass;
public void setActionClass(Class<T> cls){
this.actionClass = cls;
}
public Class<T> getActionClass(){
return this.actionClass;
}
}
并删除对它的所有 raw 引用。 (即,将 Configuration
切换到 Configuration<T>
任何使用的地方)
我使用 Java 8 的新功能从朋友那里得到了一个非常巧妙的解决方案。
public class Person{
private Configuration configuration;
public void act(){
final Action action = configuration.getActionFactory().apply(configuration);
....
}
}
public class Configuration{
private Function<Configuration, Action> actionFactory = Action::new;
public void setActionFactory(Function<Configuration, Action> actionFactory){
this.actionFactory = actionFactory;
}
public Function<Configuration, Action> actionFactory getActionFactory(){
return this.actionFactory;
}
}