最近我在某人的代码中看到他在接口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_NAME,因为我们只想在DbComment方法中使用这些值。
现在我有几个问题:
1)这个实施是否适当&好吗?
2)如果不是,我们如何在DbComment类之外声明这些变量&让这个班级成为唯一能看到这些价值观的班级。 (我们不想使用抽象类,因为一个类只能扩展java中的另一个类)
3)为什么我们确实需要使用静态值和&界面内存在哪些方法? (当我们为特定类实现某个接口时,为什么我们需要让它在任何地方都是静态的?)
4)是否有任何规范可以准确地确定java方法,类,枚举等各种不同的声明?
答案 0 :(得分:2)
1)这个实施是否适当&好吗?
是的,会工作得很好。
2)如果不是我将如何在DbComment类之外声明这些变量&使此类成为唯一看到DB_TABLE_NAME值的类。 (我不想使用抽象类,因为一个类只能扩展java中的另一个类)
不需要使用的实现按预期工作。
3)为什么我们确实需要使用静态值和&界面内存在哪些方法? (当我们为特定类实现某个接口时,为什么我们需要让它在任何地方都是静态的?)
您无法在接口final
或static
中创建方法。允许使用方法的唯一限定符是public
和abstract
,顺便说一下,它们根本没有效果。
对于字段,static
存在,但也无效。接口中声明的所有字段都可由实现者静态访问,并被视为常量。
4)是否有任何规范可以准确地确定java方法,类,枚举等各种不同的声明?
官方规范有一章Names and Declaration。
答案 1 :(得分:1)
默认情况下,即使程序员不这样做,在接口内声明的任何字段都会标记为public static final
。这意味着,界面中的任何字段都将是常量,不可能进行修改。
如果您不想要该功能(无论您有什么理由),那么最好改为使用抽象类并将该字段标记为protected static 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;
}
}