Java 在实现类的运行时未初始化接口常量
我有一个使用Java 在实现类的运行时未初始化接口常量,java,spring,interface,constants,Java,Spring,Interface,Constants,我有一个使用 static final Repsonse=新响应(…) 这些常量由接口中定义的方法作为返回值使用(或者说:应该使用) 现在我让Spring实例化实现这个接口的类,但是当应用程序运行时,这些常量不会被初始化(它们是null) 这是接口的一般问题还是Spring特有的问题? 也许有更好的方法来实现预期的功能 对于需要mroe信息的人: 接口定义了一个“检查器”,它定义了几种不同的方法来检查对象的状态。这些方法中的每一种都会返回一个标准化的响应对象,该对象是一个简单的容器,包含有关该方
static final Repsonse=新响应(…)
这些常量由接口中定义的方法作为返回值使用(或者说:应该使用) 现在我让Spring实例化实现这个接口的类,但是当应用程序运行时,这些常量不会被初始化(它们是
null
)
这是接口的一般问题还是Spring特有的问题?也许有更好的方法来实现预期的功能 对于需要mroe信息的人:
接口定义了一个“检查器”,它定义了几种不同的方法来检查对象的状态。这些方法中的每一种都会返回一个标准化的
响应
对象,该对象是一个简单的容器,包含有关该方法正在检查的对象状态的标准化信息。我认为将所有可能的响应代码定义为常量是一个好主意,这样使用接口的实现者就可以随时使用它们。也许我错了 以下是一些代码片段:
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;
}
}
可以在接口中初始化常量,但通常认为它是一种反模式,尽管它在Java库中使用 你可能想考虑下面的内容。如果响应对象很简单,并且您只希望能够区分不同的有效性级别,请在接口外部为此创建一个枚举:
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;
}
}
如果您想向响应添加更多状态(例如描述),我建议您在配置文件中初始化它们,将它们添加到映射中,并将映射注入到实现类中,如下所示,值类型为前面的“Response”类型。下面的映射是一个EnumMap,它使用有效性enum作为键
<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);
}
}
公共枚举有效性
{
有效的,无效的
}
公共接口验证程序
{
响应验证(字符串param1、字符串param2);
}
公共类验证器impl实现验证器
{
//从配置注入(记住添加getter和setter)
私人有效地图;
公共响应验证(字符串param1、字符串param2)
{
返回getValidityMap().get(Validity.VALID);
}
}
它应该可以工作。你能发布一些原始的代码片段吗,也许有人发现了其中的一个bug。我刚刚尝试了一个独立的程序,它运行得很好。事实上,spring推荐基于接口的方法。它应该会起作用。静态变量是在类加载时初始化的。感谢您的尝试!您鼓励我使用显式构造函数方法编写一个小测试,而不是使用Spring注入,事实上它是这样工作的。因此,我想在其他地方有一个错误,我会看看我的Spring集成。@m00hk00h:你在评论中写道“…使用显式构造函数方法而不是注入Spring,它确实是这样工作的。”---你的意思是,你发布的问题和代码不是使用的问题和代码;相反,您对接口中的静态变量使用了@Inject
或@Autowired
。@Ralph否,我的意思是我使用new()调用了Validator类,而不是使用Spring将类注入变量中。不过,我刚刚发现了错误:我在用于处理该类的单例实例的“getInstance()”方法中犯了一个错误,它现在可以正常工作了。如果没有你的帮助,我是不会看那些代码的。谢谢!这是一个有用的答案,但它回答了“如何防止常量接口”的问题,这从来不是我的问题。常量只是接口的一部分,有很多不同的方法是通过广泛的javadoc为实现者定义的。由于API不是公开的,所以我不认为在提供附加信息的问题上是个问题。但我完全知道这个问题——事实上,我在响应对象本身中广泛使用了枚举。