我正在为支持不同类型小部件的网页编写测试代码,每个小部件都用类(stdout
,XWidget extends AbstractWidget
等表示),我需要一个简单的方法创建Widget对象。理想情况下,它看起来像这样:
YWidget extends AbstractWidget
我目前有一个相当混乱的实现,涉及将Class对象作为参数传递(参见下面的示例),但这不是最好的方法。
public static AbstractWidget getWidget(ObjectType widgetType) {
//return some subclass of AbstractWidget
}
public enum ObjectType {
X(XWidget.class), Y(YWidget.class);
//include constructor etc.
}
任何有助于获取Generics内容(我不太了解)工作的帮助都会非常感激,甚至只是一种完全不同的方法。
答案 0 :(得分:2)
您可以让枚举负责实例化小部件:
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();
}
答案 1 :(得分:0)
如果要进行优化以获得更好的可测试性,可能需要使用创建方法(或直接使用注入,如果您的方案允许)。
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
}
}