Java 如何使用特定的实体类型来泛化工厂?
我如何泛化方法Java 如何使用特定的实体类型来泛化工厂?,java,generics,design-patterns,refactoring,Java,Generics,Design Patterns,Refactoring,我如何泛化方法getBuilder,使其不依赖于对象,而是依赖于UnitBuilder或SourceBuilder的类型 public class BuilderFactory { Object getBuilder (Object entity) throws UnsupportedResourceEntityType { if (entity instanceof Source){ return new SourceBuilder();
getBuilder
,使其不依赖于对象
,而是依赖于UnitBuilder
或SourceBuilder
的类型
public class BuilderFactory {
Object getBuilder (Object entity) throws UnsupportedResourceEntityType {
if (entity instanceof Source){
return new SourceBuilder();
}
if (entity instanceof Unit){
return new UnitBuilder();
}
throw new UnsupportedResourceEntityType();
}
}
被迫提供一个类的实例只是为了了解它的类,这没有什么意义。您应该将
SourceBuilder.class
或UnitBuilder.class
作为参数传递,因此您的方法是(我假设您为这两个类保留一个公共超类型,并且这些类具有默认构造函数):
T getBuilder(类clazz){
返回clazz.newInstance();
}
在SourceBuilder
和UnitBuilder
之间有什么关系吗?那么为什么不用这种常见类型替换对象呢?或者更好,通过这个公共类实现的接口。是的,但我要删除它们的超类(父类)。我不想将formObject
强制转换为UnitBuilder
或SourceBuilder
。为什么要删除父类?不!除了结果类上的实例之外,我不能将任何东西传递到getBuilder方法。事实上,我也不能使用反射API。因为我正在寻找另一个解决方案。反射是我不能在代码中使用的东西。这是我导师的限制。所以没有反射:)在Java中,没有办法使它变得简单和清晰。它与Java无关,你拒绝了所有好的方法。如果您的类型没有关系,那么您的整个方法就是糟糕的设计。
<T extends SuperType> T getBuilder (Class<T> clazz) {
return clazz.newInstance();
}