2013-06-27 35 views
3

我有一个PropertyBag类,它可以模拟可由对象消耗的一组属性。标准化java构造函数以供反射使用

我也有几类A1, A2, ..., AN有形式

public A...(PropertyBag);

的构造所有这些类都实现了接口iA

我使用反射来创建相关A...传递一个PropertyBag。我从PropertyBag对象中提取数据以生成该类的候选成员数据。

我想要做的是通过强制A...类的实现者编译时间来实现上述形式的构造函数。我意识到我的要求很奇怪:为什么你想要标准化施工参数?但我在这里有一个例子。

我当然可以做的是有一个单独的构建和初始化步骤,因为我可以将初始化函数标记为抽象的,甚至可以将iA更改为包含该抽象初始化函数定义的抽象类。我会用反射来初始化。如果任何A...缺少初始化函数,那么这会给我编译时间失败,因为我希望。但我不喜欢将构造和初始化分离为构建但未初始化的对象没有意义的想法。

我在这里错过了一招吗? (在C++中,我可以在编译时使用模板强制执行,但在Java中看不到方法)。

回答

8

我希望能够做的事情是强制类A的实现者在编译时实现上述形式的构造函数。

你不能,我害怕。 Java内部没有任何东西会强制执行此操作。

什么你可能做的是(例如,通过在一个jar文件中发现的所有类)编写一个单元测试,找到实现接口的所有类,然后再检查,他们有这样的构造。它不如编译时安全,但总比没有好。

1

尽管什么乔恩说,还有一个办法迫使一个构造。

从接口iA创建一个抽象类。在这个抽象的实现中,你定义了你想要的构造函数,并确保没有默认构造函数。

让所有类扩展抽象实现。他们将被迫执行a构造函数并调用超级构造函数(这是您将把初始化代码放在哪里)。

虽然有一个问题。实现的构造函数可以有任何签名(默认的除外)。

也许这个把戏可以帮助你。

1

您可以间接地实现这一点,通过为构造函数创建抽象

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

这增加了复杂一点点,更多的类,更多的接口,你可能需要一个Constructor实施每iAN

相关问题