【问题标题】:Why interface variables need initialization?为什么接口变量需要初始化?
【发布时间】:2018-03-08 08:13:30
【问题描述】:

我想创建一个接口,强制所有实现它的类定义一个静态的最终整数变量:

public interface FooInterface {
    static final int bar;
}

但是编译器说“变量'bar'可能没有被初始化”。为什么我必须在界面中给它一个值?我希望每个实现都定义自己的值,所以对我来说,我必须放一些永远不会使用的任意数字似乎不合逻辑。

【问题讨论】:

    标签: java oop interface


    【解决方案1】:

    你不能用界面来做到这一点。接口中的所有变量都隐含为public final static

    您可以在接口中定义int getBar();,然后所有实现类都需要返回一个值。

    您有责任确保实现者表现良好,但您不能阻止实现返回不同的值,例如

    public class Foo implements Bar {
        public int getBar() {
            return (int) System.currentTimeMillis();
        }
    }
    

    【讨论】:

    • @GiacomoAlzetta 确定您可以编写返回随机值的恶意代码,但无法通过将方法设为静态来解决。
    • @GiacomoAlzetta 您希望实现类单独实现的静态方法在概念上没有意义。
    • @Michael 是的,它只是 Java 不支持 abstract static 的概念,很多其他语言很容易支持。
    • @GiacomoAlzetta 因为其他语言支持它并不意味着它在概念上有意义。
    • @MartinHeralecký 接口一直是关于行为的,而不是数据。对我来说,这根本不合逻辑。
    【解决方案2】:

    你从错误的角度考虑这个问题。

    static final 不能在实现类中被覆盖。

    你可能想这样做:

    public interface FooInterface {
        int getBar();
    }
    

    【讨论】:

      【解决方案3】:

      你不能那样做。接口只能强制实现它的类实现方法。

      接口中定义的静态变量属于接口。它不会强制实现类声明相同的变量。

      【讨论】:

        【解决方案4】:

        接口中的每个变量都是静态的和最终的。 final 变量必须在第一行或构造函数中初始化。因为接口没有构造函数,所以必须在第一行初始化 final 变量。

        【讨论】:

          【解决方案5】:

          因为它们是最终变量,需要初始化最终变量。

          【讨论】:

            【解决方案6】:

            在普通类中,我们可以选择这样定义它并在静态初始化块中初始化它的值:

            public class FooClass {
                static final int bar;
            
                static {
                    bar = 5;
                }
            }
            

            在接口的情况下,不允许静态初始化块,这就是 Java 要求在声明时将其设置为值的原因。

            【讨论】:

              猜你喜欢
              • 2018-06-11
              • 2015-08-29
              • 2015-09-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多