【问题标题】:The blank final field conn may not have been initialized on a non final member空白的最终字段 conn 可能尚未在非最终成员上初始化
【发布时间】:2018-06-06 20:18:26
【问题描述】:

所以我有这个接口 QueryAndRetrieval 并且我想强制实现它的每个类都有一些变量以及一些非常简单的方法,但是如果我尝试将一个变量定义为第 5 行的那个

public interface QueryAndRetrieval {

    public String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
    public String JDBC_URL = "jdbc:derby:CompanyDB;create=true";
    public static Connection conn;

    public boolean containsEntry(String TableName, Object key);

    public static Connection connect() throws SQLException {
        return DriverManager.getConnection(JDBC_URL);
    }
}

Eclipse 告诉我

空白的最终字段 conn 可能尚未初始化

但是界面中没有最终字段。谁能告诉我为什么会发生这种情况以及如何解决?请假设界面中存在所有必要且正确的导入。

【问题讨论】:

标签: java eclipse interface


【解决方案1】:

在 Java 中,接口 指定了所有实现者都必须响应的 API。 如何他们如何做到这一点取决于实现,因此在实现者身上强制一个字段是没有意义的。

如果您想提供一些易于实现的支持,那么可以使用接口和抽象基类——例如

public interface QueryAndRetrieval {

    public String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
    public String JDBC_URL = "jdbc:derby:CompanyDB;create=true";

    public boolean containsEntry(String TableName, Object key);

    public abstract Connection connect() throws SQLException;
}

public abstract class QueryAndRetrievalBase {
    public Connection conn;

    public Connection connect() throws SQLException {
        return DriverManager.getConnection(QueryAndRetrieval.JDBC_URL);
    }
}

public class MyQueryImpl extends QueryAndRetrievalBase { ... }

请注意,从 Java 8 开始,接口也可以提供default methods,但仍然不能在接口中声明成员变量,因此那些默认方法仍然不能使用“抽象”成员。

【讨论】:

    【解决方案2】:

    默认情况下,接口中的所有属性都是public static final。 因此,如果您不使用conn 属性,只需将其删除即可。

    如果您正在使用它,您可能需要在代码中使用静态初始化块来将值设置为 conn

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 2016-04-07
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多