标准化java构造函数以供反射使用
我有一个标准化java构造函数以供反射使用,java,Java,我有一个PropertyBag类,它对对象可消费的一组属性进行建模 我还有几个类,A1,A2,…,一个,它们具有以下形式的构造函数 public A…(PropertyBag) 所有这些类都实现了接口iA 我使用反射创建相关的A..传入PropertyBag。我从PropertyBag对象中提取数据,以生成类的候选成员数据 不过我想做的是在编译时强制类的实现者实现上述形式的构造函数。我知道我的要求有点奇怪:你为什么要标准化施工参数?但我这里有一个理由 当然,我可以做的是有一个单独的构造和初始化步
PropertyBag
类,它对对象可消费的一组属性进行建模
我还有几个类,A1,A2,…,一个
,它们具有以下形式的构造函数
public A…(PropertyBag)代码>
所有这些类都实现了接口iA
我使用反射创建相关的A..
传入PropertyBag
。我从PropertyBag
对象中提取数据,以生成类的候选成员数据
不过我想做的是在编译时强制类的实现者实现上述形式的构造函数。我知道我的要求有点奇怪:你为什么要标准化施工参数?但我这里有一个理由
当然,我可以做的是有一个单独的构造和初始化步骤,因为我可以将初始化函数标记为抽象的,甚至可以将iA
更改为包含该抽象初始化函数定义的抽象类。我会使用反射调用初始化。如果任何A..
缺少初始化函数,这将导致编译时失败。但我不喜欢将构造和初始化分离的想法,因为构造但未初始化的对象没有任何意义
我错过了一个技巧吗?(在C++中,我可以在模板中使用模板执行,但是在java中看不到方法)。
我想做的是强制类的实现者。。。在编译时实现上述形式的构造函数
恐怕你不能。Java中没有任何东西可以强制执行这一点
您可以编写一个单元测试,查找实现接口的所有类(例如,通过查找jar文件中的所有类),然后检查它们是否有这样的构造函数。它不如编译时安全,但总比没有好。不管Jon怎么说,有一种方法可以强制构造函数
从接口iA创建一个抽象类。在这个抽象实现中,您定义了所需的构造函数,并确保没有默认构造函数
让您的所有类扩展抽象实现。他们将被迫实现一个构造函数并调用超级构造函数(这是您放置初始化代码的地方)
不过有一个陷阱。实现的构造函数可以有任何签名(默认签名除外)
也许这个技巧可以帮助您。您可以通过为构造函数创建抽象来间接实现这一点:
public class ConstructionTest {
private interface Constructed { // iA in the question
// some methods
}
private static class PropertyBag {
}
private interface Constructor {
public Constructed construct(PropertyBag bag);
}
public class TestConstructor implements Constructor {
public Constructed construct(PropertyBag bag) {
return new Constructed() { };
}
}
@Test
public void testConstruct() {
Object potentialConstructor = new TestConstructor();
if (Constructor.class.isAssignableFrom(potentialConstructor.getClass())) {
Constructor constructor = (Constructor) potentialConstructor;
Constructed constructed = constructor.construct(new PropertyBag());
assertNotNull(constructed);
}
}
}
这稍微增加了复杂性,增加了类和接口,并且您可能需要为每个iAN
实现一个Constructor