Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在实现类的运行时未初始化接口常量_Java_Spring_Interface_Constants - Fatal编程技术网

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不是公开的,所以我不认为在提供附加信息的问题上是个问题。但我完全知道这个问题——事实上,我在响应对象本身中广泛使用了枚举。