Java 使用接口导入最终字段(对/错)

Java 使用接口导入最终字段(对/错),java,interface,Java,Interface,最近,我在某人的代码中看到,他在接口ex中实现了他的最终类变量字段: public interface commentSchema{ static final String DB_TABLE_NAME = "comment"; ... } &他实现了一个类,该类确实需要以下变量: public class DbComment implements commentSchema { // use the DB_TABLE_NAME value here ... ... } 正如您

最近,我在某人的代码中看到,他在接口ex中实现了他的最终类变量字段:

public interface commentSchema{
  static final String DB_TABLE_NAME = "comment";
  ...
}
&他实现了一个类,该类确实需要以下变量:

public class DbComment implements commentSchema {
  // use the DB_TABLE_NAME value here ...
  ...
}
正如您所知,如果有人因为继承方面而创建了DbComment类的实例,他将能够访问DB_TABLE_名称,这是不正确的,因为我们只希望在DbComment方法中使用这些值

现在我有几个问题:

1) 这个实现正确吗

2) 如果不是,我们如何在DbComment类之外声明这些变量&使这个类成为唯一看到这些值的类。(我们不想使用抽象类,因为在java中一个类只能扩展另一个类)

3) 为什么我们需要对存在于接口中的值和方法使用静态?(当我们为一个特定的类实现特定的接口时,为什么我们需要将其设置为静态以便随处可见?)


4) 是否有任何规范可以准确地确定java方法、类、枚举等的不同声明类型?

默认情况下,接口中声明的任何字段都标记为
公共静态final
,即使程序员没有这样做。这意味着,接口中的任何字段都是常量,无法修改

如果您不想要该功能(无论您有什么理由),那么最好使用一个抽象类,并将字段标记为
受保护的静态final

public abstract class CommentSchema{
    protected static final String DB_TABLE_NAME = "comment";
}
尽管如此,如果您希望将设计基于接口,那么您可以使用不带此字段的接口,然后是一个实现此接口并添加此字段的抽象类。通过这样做,扩展抽象类的每个类都将实现接口并访问字段:

public interface CommentSchema {
    foo();
}

public abstract class CommentSchemaAbstractImpl implements CommentSchema {
    protected static final String DB_TABLE_NAME = "comment";
}

public class CommentSchemaRealImpl extends CommentSchemaAbstractImpl {
    @Override
    public void foo() {
        //do something...
        baz(DB_TABLE_NAME);
    }
    private void baz(String s) {
        //fancy code here...
    }
}
最后,您可以忘记所有这些,创建一个枚举来处理常量

public enum TableName {
    COMMENT("comment");
    private String tableName;
    private TableName(String tableName) {
        this.tableName = tableName;
    }
}
1) 这个实现正确吗

是的,很好用

2) 如果这不是我将如何在DbComment类之外声明这些变量&让这个类成为唯一一个看到DB_TABLE_NAME值的类。(我不想使用抽象类,因为在java中一个类只能扩展另一个类)

不需要,因为所使用的实现按预期工作

3) 为什么我们需要对存在于接口中的值和方法使用静态?(当我们为一个特定的类实现特定的接口时,为什么我们需要将其设置为静态以便随处可见?)

您不能在接口
final
static
中创建方法。方法所允许的唯一限定符是
public
abstract
,顺便说一句,它们根本没有任何效果

对于字段,
static
存在,但也没有效果。接口中声明的所有字段都可以由实现者静态访问,并被视为常量

public enum TableName {
    COMMENT("comment");
    private String tableName;
    private TableName(String tableName) {
        this.tableName = tableName;
    }
}
4) 是否有任何规范可以精确地确定java方法、类、枚举等的不同声明类型


官方规范有一章介绍。

注意:我意识到官方规范可能是一个过于宽泛的文档。如果你在
4)
这一点上更具体一些,我们可以得到一个更接近你怀疑的答案。thanx 4你的答案我已经投了票……当然!希望有帮助!直截了当!thnx