【问题标题】:Java- Using a constant in an abstract class that needs to be used by subclasses as wellJava-在抽象类中使用子类也需要使用的常量
【发布时间】:2012-05-03 16:36:41
【问题描述】:

我有一个抽象类和 2 个子类。有 4 个常量与所有类相关。我打算将决赛放在抽象类中,但我知道最终变量不是继承的? 我是否必须在每个类中定义常量(似乎效率低下)?或者只是让常量成为一个即时变量(听起来不是个好主意)?

我有什么方法可以解决这个问题?

【问题讨论】:

    标签: java constants abstract final


    【解决方案1】:

    如果在抽象类中定义以下内容,您的所有子类都可以使用。

    public static final Integer MYCONSTANT = 42;
    

    static final Integer MYCONSTANT = 42;
    

    protected static final Integer MYCONSTANT = 42;
    

    第二个(包私有)仅适用于同一包中的类。第三个(受保护的)将可供所有子类使用,无论它们的包如何。

    【讨论】:

    • 我没有尝试过,但我确信只有当子类在同一个包中时,第二个才成立。
    • 那你应该这样写,OP好像是初学者,可能会混淆。
    【解决方案2】:

    常量由子代继承。您只需确保拥有它们 protectedpublic 以便孩子们可以访问它们。

    abstract class A {
        protected final static String FOO = "bar";
    }
    class B extends A {
        somemethod() {
            System.out.println("foo: " + FOO);
        }
    }
    

    可以从类及其所有子类中访问。

    【讨论】:

    • 据我所知,使用 protected 是“惰性”编程,不应该使用。
    • @spaz:我们在这里讨论常量的可见性——这不是真正的继承。您还可以创建一个Constants 类,到目前为止,我在所有项目中都看到了它。顺便说一句:将“受保护的”可见性称为“懒惰”是有问题的……这完全取决于您的需求。
    • @spaz 取决于上下文。对于一个final 变量,它应该可以被它自己的类和它的孩子访问,这是做事的完美方式。所以......真的......为什么要'懒惰'编程呢?应该改用什么?
    • @home 是的,但如果你的常量 class 只是将常量放在里面,那么将其设置为 interface 会更好(是的,常量接口很棒!)跨度>
    • 常量类或接口通常是一种反模式。常量属于它们的上下文,在本例中是基类。
    【解决方案3】:

    是的。但是由于它们是恒定的,因此应该是 final and staticstatic modifier 使其只有一个“副本”,如果仅在子类中使用,则您可以使用 protected 或者如果来自其他类也必须做到public

    【讨论】:

      猜你喜欢
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多