Java - 在接口中声明变量但不分配它们

时间:2014-04-30 00:25:19

标签: java inheritance interface

我正在尝试创建一个形状类,其子类将是具有恒定面数的形状。我想让这个形状类实现一个接口,确保每个类实现几个将在构造函数中分配的常量。

public abstract class Shapes{
public static final int edges; 
    public Shapes(int edges) {
        this.edges = edges;
    }
}

public interface Shapeable{
    int edges;
}

这给了我一个编译错误,说明变量可能没有被初始化。我该怎么做而不是为了确保形状的所有子类都实现一个名为edges的变量,但每个类都有变化?

3 个答案:

答案 0 :(得分:4)

您不能强制某个类拥有变量,但使用接口可以强制它拥有方法。将界面中的edges变量更改为方法。

public interface Shapeable {
    int getNumEdges();
}

然后实施者必须实施该方法,但他们可以自由地返回他们想要的任意数量的边缘。

答案 1 :(得分:1)

界面上的任何字段都会自动public static final。你不能“实现”一个领域,这个概念不存在。 Java中的接口是方法的 PUBLIC API 的定义,因此只包含公共方法签名。

我建议你研究使用枚举或在界面中定义getter,正如rgettman所暗示的那样,constant interface反模式有太多的缺点。如果您确实想要正确使用它,只需查看该链接即可。简而言之,常量接口反模式实际上只是允许在代码中方便地命名常量。使用常量接口反模式与使用只有公共静态最终成员的类完全相同,否则(实际上,我们有import static antipattern用于此目的,但注意oracle的建议和谨慎使用< /强>)

编辑:

您收到“未初始化”错误的原因是因为正如我所说,界面上的字段会自动public static final,无论您在其上放置什么修饰符。由于您没有初始化static final字段,编译器会向您抱怨。

答案 2 :(得分:0)

您也可以创建一个抽象类,并将该变量初始化为一个无意义的值,然后子类可以覆盖它。

public abstract class Shape{
    int edges = -1;
}