3

我有一个接口,其中使用
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;
    }
}
4

1 回答 1

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);
    }
}
于 2013-08-05T16:40:16.490 回答