【问题标题】:How use static extended variables in Java?如何在 Java 中使用静态扩展变量?
【发布时间】:2018-12-24 19:46:44
【问题描述】:

我们有base 类如下:

public class Base {
    protected static string rule = "test_1";

    public static getRule(){
    /* get rule value from origin class*/
    }
}

我们有一些从base 类扩展而来的类。例如:

public class Derived extends Base {
     static {
          rule = "test_2";
     }
}

现在我们想要获取规则变量,但是在某些情况下:

  • 如果用户调用Derived.getRule(),则返回test_2
  • 如果在derivedrule变量没有初始化,它返回test_1
  • 我不想在所有子类中覆盖 getRule 来回答问题。

我该怎么办?

【问题讨论】:

  • 静态方法和字段不受覆盖。如果你的基类中有一个实例方法,你可以重写它以在派生类中返回不同的东西。但是如果你真的想直接在Derived类上调用Derived.getRule(),你可以在Derived中定义一个静态方法getRule()
  • Derived 中定义一个名为getRule() 的方法,它将getRule 隐藏在base 中。但这似乎是一个普遍不明智的设计。
  • 你不能使用静态,它们必须在非常具体的情况下使用,考虑你的模型
  • @azro 你能举个例子吗?
  • 基本上,不要认为继承适用于静态的东西。您甚至可以创建一个完全不相关的类并创建一个从Base 获取rule 的静态getter,以及一个从Base 设置rule 的setter。简而言之,extends这个词在这个上下文中的意思是nothing,只是继承类中的rule会自动指向直接超类中的rule,除非当前类中已经存在一个.

标签: java static-methods static-variables


【解决方案1】:

问题是,一旦使用(初始化)Derived 类,Base.rule 就会改变,现在到处都返回 test_2,而与实际类无关。

因此该技术必须在没有静态的情况下完成(以那种形式)。有一个分类级别的值。

public class Base {
    private static final String BASE_RULE = "test_1";

    public String getRule() {
        return BASE_RULE;
    }
}

public class Derived extends Base {
    private static final String DERIVED_RULE = "test_2";

    @Override
    public String getRule() {
        return DERIVED_RULE;
    }
}

或者,您可以使用标记接口 - 但是它们不是互斥的,因此不适用于某些 getCategory()。

public class Base implements Test1Category {
}

public class Derived extends Base implements Test2Category { ... }

if (base instanceof Test2Category) { ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2012-01-19
    • 2013-11-13
    • 1970-01-01
    • 2010-11-26
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多