标准化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