【问题标题】:Java - How to make changeable (by subclass) static fields of a superclass, but protect them from i.e. main()?Java - 如何使超类的可变(按子类)静态字段,但保护它们不受主()的影响?
【发布时间】:2016-10-30 17:36:59
【问题描述】:

如何保护某些超类的静态字段不被更改(例如在主方法中),同时通过子类中的设置器保持这种可能性。据我所知,将其设为私有不会成功,因为私有静态字段不是子类的一部分。我唯一能研究的 正在使它们受到保护并将这些类(没有主类)包含在一个包中。 有更简单的解决方案吗?

【问题讨论】:

  • 就个人而言,我认为你应该重新考虑这个要求,这听起来一般来说是一个非常糟糕的主意。您的解决方案应该可行,但我再次提醒您重新考虑设计。
  • 为什么它们是静态的?为什么子类必须修改超类中的任何静态内容?这种设计听起来会很麻烦/很难维护。您应该发布您的实际问题,以便人们可以批评/提供可能更好的解决方案。
  • 我同意另外两个:这是一个糟糕的想法。什么会阻止我创建一个更改静态变量的子类?那会弄乱所有其他子类。请帮助我们了解您实际想要做什么,因为不是这样。

标签: java static field


【解决方案1】:
class Main{
    public static void main(String[] args){
        Foo.precious = "nothingness";
    }
}
class Foo{
    static String precious = "Precious data";
}

class Bar extends Foo{
    Foo.precious = "More precious";
}

如果我在 Foo 类中为珍贵的添加一个私有修饰符,那么我将保护它免受 main() 的影响,但是也失去在子类中更改它的能力。

【讨论】:

    【解决方案2】:

    没有访问修饰符使成员/静态/方法对子类可见,但对包不可见。

    这取自Oracle Documentation

    【讨论】:

      【解决方案3】:

      当期望子类覆盖其父类的行为时,您必须遵守 OOD 规则:您最好将它们设为非静态变量,以便子类可以重新定义它们并覆盖其公共 getter:

      class Foo{
          private String precious = "Precious data";
      
          public String getPrecious() { return precious; }
      }
      
      class Bar extends Foo{
          private String precious = "more precious";
      
          @Override       
          public String getPrecious() { return precious; }
      }
      
      class Main{
          public static void main(String[] args){
          Foo.precious = "nothingness"; // Compilation error: field precious is not visible.
          Foo.setPrecious("x");   // Compilation error: No such public method.
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-07-09
        • 2021-01-09
        • 2013-05-27
        • 2011-06-22
        • 2013-06-20
        • 2010-10-01
        • 1970-01-01
        相关资源
        最近更新 更多