接口中的默认方法,但只有静态最终字段

default methods in interface but only static final fields

我知道界面中的所有 字段 都是隐含的 static and final。这在 Java 8.

之前是有道理的

但是随着 默认方法 的引入,接口也具有抽象 class 的所有功能。因此,非静态和非最终字段也是必需的。

但是当我尝试正常声明一个字段时,默认情况下它变成了 static 和 final。

有没有办法在Java 8.

的接口中声明一个非静态和非final字段

还是我完全误解了什么???

否 - 在 Java 8 中,所有字段都是静态的和最终的,与以前的 Java 版本一样。

在接口中包含状态(字段)会引发问题,特别是与 the diamond problem.

有关的问题

另请参阅 this entry,其中阐明了行为继承和状态继承之间的区别。

Java中接口的所有字段都是public static final.

即使添加了默认方法,在接口中引入可变字段仍然没有任何意义。

由于接口演化的原因添加了默认方法。您可以向接口添加新的默认方法,但只有在实现中使用已经定义的方法时才有意义接口:

public interface DefaultMethods {

    public int getValue();

    public default int getValueIncremented() {
        if (UtilityMethod.helper()) { // never executed, just to demonstrate possibilities
            "string".charAt(0); // does nothing, just to show you can call instance methods
            return 0;
        }

        return 1 + getValue();
    }

    public static class UtilityMethod {

        public static boolean helper() {
            return false;
        }
    }
}

否 - 在 java 8 中,您不能在接口中没有 public static final 字段,不幸的是。

但我希望将来这会被添加到语言中。

Scala 允许与非静态字段进行接口,这为代码重用和组合开辟了比 Java 8

中更多的可能性

我强烈不建议这样做。请改用抽象 classes。但是如果你真的需要它,你可以用一些包装器 class 做一些变通技巧。这是一个例子:

public interface TestInterface {

    StringBuilder best = new StringBuilder();

    default void test() {
        best.append("ok");
        System.out.print(best.toString());
    }
}