Java如何返回一个依赖于指定参数的类的对象?

时间:2015-12-09 12:34:35

标签: java generics

我正在为支持不同类型小部件的网页编写测试代码,每个小部件都用类(stdoutXWidget 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内容(我不太了解)工作的帮助都会非常感激,甚至只是一种完全不同的方法。

2 个答案:

答案 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
    }
}