接口常量在实现类时未在运行时初始化

时间:2013-08-05 09:51:22

标签: java spring interface constants

我有一个接口,其中常量使用
定义 static final Repsonse = new Response(...)
这些常量通过接口中定义的方法作为返回值使用(或者更确切地说:应该使用)。

现在我让Spring实例化实现此接口的类,但是在运行应用程序时,这些常量不会被启动(它们是null)。

这是接口的一般问题还是特定于Spring的东西?
也许有更好的方法来实现预期的功能?

对于那些需要mroe信息的人:
该接口定义了一个“检查器”,它定义了几种不同的方法来检查对象的状态。这些方法中的每一种都应该返回一个标准化的Response对象,这是一个简单的容器,其中包含有关该方法正在检查的对象状态的标准化信息。
我认为将所有可能的响应代码定义为常量是一个好主意,因此使用该接口的实现者将它们放在手边。也许我错了?

以下是一些代码段:

public interface Validator
{
    static final Response VALID = new Response(some params);

    /** is expected to return the Response VALID */
    Response validate(String param1, String param2);
}

public class ValidatorImpl implements Validator
{
    public Response validate(String param1, String param2)
    {
        //VALID is null; also tried explicit static access here, no luck either
        return VALID;
    }
}

1 个答案:

答案 0 :(得分:1)

可以在接口中初始化常量,但尽管在Java库本身中使用它,但它通常被认为是反模式。 http://en.wikipedia.org/wiki/Constant_interface

您可能需要考虑以下事项。如果Response对象很简单,并且您只是希望能够区分不同的有效级别,请在界面外为此创建一个枚举:

public enum Validity
{
    VALID, INVALID
}

public interface Validator
{
    Validity validate(String param1, String param2);
}

public class ValidatorImpl implements Validator
{
    public Validity validate(String param1, String param2)
    {
        return Validity.VALID;
    }
}

如果您想在响应中添加更多状态(例如说明),我建议您在配置文件中初始化它们,将它们添加到地图中并将地图注入您的实现类,如下所示,值类型为您的早期的“响应”类型。下面的地图是EnumMap,它使用Validity枚举作为键。

<util:map id="validityMap">
  <entry key="#{T(com.acme.Validity).VALID}" value-ref="valid" />
  <entry key="#{T(com.acme.Validity).INVALID}" value-ref="invalid" />
</util:map>

<bean id="valid" class="com.acme.Response">
    <property name="comment" value="This is valid" />
</bean>

<bean id="invalid" class="com.acme.Response">
    <property name="comment" value="This is invalid" />
</bean>

public enum Validity
{
    VALID, INVALID
}

public interface Validator
{
    Response validate(String param1, String param2);
}

public class ValidatorImpl implements Validator
{
    // Inject from config (remember to add getter and setter)
    private validityMap;

    public Response validate(String param1, String param2)
    {
        return getValidityMap().get(Validity.VALID);
    }
}