【问题标题】:Modifiable constants inside an interface接口内的可修改常量
【发布时间】:2011-08-29 08:24:46
【问题描述】:

我知道基于the Java tutorials

除了方法声明之外,接口还可以包含常量声明。接口中定义的所有常量值都是隐式公共的、静态的和最终的。同样,这些修饰符可以省略。

是否可以让实现该接口的所有类共享和修改接口内的值?

【问题讨论】:

    标签: java interface constants


    【解决方案1】:

    理论上,是的,如果您为“常量”使用可变类型,例如AtomicReference.
    但是,这将是一个糟糕的设计!

    public interface MyInterface{
        AtomicReference<String> NAME = new AtomicReference<String>("Fred");
    }
    
    
    public static void main(final String[] args){
        System.out.println(MyInterface.NAME);
        MyInterface.NAME.set("Jim");
        System.out.println(MyInterface.NAME);
    }
    

    输出:

    弗雷德
    吉姆

    您可以使用 Collections、Maps、Arrays 或任何其他可变地保存此模式值的类型,但我会认真地要求您重新考虑它。

    【讨论】:

    • 没有这样的选项。这是一个测试中的问题。它是否正确? : 'interface blah { Integer[] a = new Integer[500]; }'
    • @Eternal_Light 是的,它是正确的,因为它可以编译(并且可以工作)。但并非所有编译的东西都应该使用:-)
    【解决方案2】:

    是否可以共享接口内的值 并且可以被所有实现上述接口的类修改?

    实现接口的类看到常量,但常量是最终的(实例化一次,从不重新声明)。如果您的常量是 List 之类的对象,您可以从中添加/删除对象。

    【讨论】:

      【解决方案3】:

      你不应该想要这个:),这将是一个大黑客。

      使用抽象类代替接口来创建可修改的值——当然,如果您可以在设计中使用抽象类。

      【讨论】:

      • 是的,我知道而且我认为我永远没有理由使用它。这是给我的考验。
      【解决方案4】:

      您的接口可以为您想要更改的值声明访问器。您可以调用访问器来获取和设置值,而不是直接引用常量。这些值实际上是实现接口的类的成员。虽然它们可能是静态的,也可能不是静态的,但它们不一定是最终的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-27
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-21
        相关资源
        最近更新 更多