我有一个接口,其中常量使用
定义
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;
}
}
答案 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);
}
}