使用interface(RIGHT / WRONG)导入最终字段

时间:2013-05-18 20:06:26

标签: 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 ...
  ...
}

如你所知如果有人因为继承方面而创建DbComment类的实例,他将能够访问不合适的DB_TABLE_NAME,因为我们只想在DbComment方法中使用这些值。

现在我有几个问题:

1)这个实施是否适当&好吗?

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

3)为什么我们确实需要使用静态值和&界面内存在哪些方法? (当我们为特定类实现某个接口时,为什么我们需要让它在任何地方都是静态的?)

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

2 个答案:

答案 0 :(得分:2)

  

1)这个实施是否适当&好吗?

是的,会工作得很好。

  

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

不需要使用的实现按预期工作。

  

3)为什么我们确实需要使用静态值和&界面内存在哪些方法? (当我们为特定类实现某个接口时,为什么我们需要让它在任何地方都是静态的?)

您无法在接口finalstatic中创建方法。允许使用方法的唯一限定符是publicabstract,顺便说一下,它们根本没有效果。

对于字段,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;
    }
}