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