Java如何返回类依赖于指定参数的对象?
我正在为支持不同类型小部件的网页编写测试代码,每个小部件都用一个类表示(Java如何返回类依赖于指定参数的对象?,java,generics,Java,Generics,我正在为支持不同类型小部件的网页编写测试代码,每个小部件都用一个类表示(XWidget extensed AbstractWidget,YWidget extensed AbstractWidget等),我需要一种创建小部件对象的简单方法。理想情况下,它看起来像这样: public static AbstractWidget getWidget(ObjectType widgetType) { //return some subclass of AbstractWidget } public
XWidget extensed AbstractWidget
,YWidget extensed AbstractWidget
等),我需要一种创建小部件对象的简单方法。理想情况下,它看起来像这样:
public static AbstractWidget getWidget(ObjectType widgetType) {
//return some subclass of AbstractWidget
}
public enum ObjectType {
X(XWidget.class), Y(YWidget.class);
//include constructor etc.
}
我目前有一个相当混乱的实现,它涉及将类对象作为参数传入(见下面的示例),但这不是最好的方法
public static <T extends AbstractWidget<?>> T getWidget(Class<T> objectType) {
try {
return objectType.getConstructor(new Class[] {WebElement.class}).newInstance(/*some WebElement*/);
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
return null;
}
public <T extends AbstractWidget<?>> T createWidget(Class<T> objectType) {
//create widget of type objectType
return getWidget(objectType);
}
publicstatic>T createWidget(类objectType){
//创建objectType类型的小部件
返回getWidget(objectType);
}
如果能帮助泛型工作(我真的不太理解),我们将不胜感激,甚至是一种完全不同的方法。您可以让enum负责实例化小部件:
public static AbstractWidget getWidget(ObjectType widgetType) {
return widgetType.instantiate();
}
public enum ObjectType {
X {
@Override
XWidget instantiate() {
return new XWidget();
}
},
Y {
@Override
YWidget instantiate() {
return new YWidget();
}
};
abstract AbstractWidget instantiate();
}
如果您想要优化以获得更好的可测试性,您可能想要使用创建方法(或者直接使用注入,如果您的场景允许的话)
当您将对象类传递给getWidget方法时,为什么不直接调用类构造函数呢?无法删除getWidget方法。示例:可以使用新的XWidget()来代替调用getWidget(XWidget.class)。我尝试在实际的测试脚本中使用helper方法,使它们更易于阅读,并且希望任何扩展它们的人都不必开始调用构造函数。我还有另一种创建小部件的方法(我会将其编辑到主要问题文本中),这种方法不可能只与构造函数一起工作。@Lanis您是否使用任何周围的框架来为您进行注入?像Spring、EJB3还是类似的?然后你可能想通过注射来解决这个问题。我想得越久,你很可能有XY问题。请描述你的实际问题,而不是你认为应该如何解决。阅读了解XY问题是什么。我已经使用了另一个发布的解决方案,但感谢大家对XY问题的了解,我将在未来尝试更清楚地了解。我不知道你可以使用枚举来实现这一点,这是一个很好的简单解决方案。干杯
public class WidgetClientClass {
protected AbstractWidget myWidget;
protected AbstractWidget getWidget() {
return myWidget;
}
protected void createXWidget() {
myWidget = new XWidget();
}
protected void createYWidget() {
myWidget = new YWidget();
}
}
public class WidgetClientTest {
private class WidgetClientClassForTest extends WidgetClientClass {
public void setWidget(AbstractWidget whateverFitsTheTest) {
myWidget = whateverFitsTheTest;
}
}
public void testZWidget {
WidgetClientClassForTest instance = new WidgetClientClassForTest();
instance.setWidget(new ZWidget());
// do your tests
}
}