2

最近我在某人的代码中看到他在接口 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)这个实现是否正确&ok?

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

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

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

4

2 回答 2

2

1)这个实现是否正确&ok?

是的,会工作得很好。

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

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

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

您不能在接口finalstatic. 方法允许的唯一限定符是publicabstract顺便说一句,它们根本没有效果。

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

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

官方规范有一章是关于Names and Declaration的。

于 2013-05-18T20:18:18.160 回答
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;
    }
}
于 2013-05-18T20:16:25.947 回答