Java强制静态字段继承

问题描述 投票:0回答:1

我已经搜索了相当多的时间来找到解决这个问题的方法,但没有一个能让人接受。

假设我们有一个抽象类,它的所有子类都应提供一个静态和最终字段。

abstract class A {
    static final Field FOO;
}

class B extends A {
    static final Field FOO = new Field("foo");
}

就像这样:应该有 B 的实例,我不希望它们有一个 getter,这意味着我将不得不创建一个抽象方法,但我又遇到了同样的问题。

吸气剂:

abstract class A {
    static final Field FOO;
    public Field getFOO() { return A.FOO; }
        // This method is not that great as I need it to be static.
        // Also, as it refers to class A, but if I want to let B inherit this method it won't refer to B.FOO.
    public static Field getFOO() { return FOO; }
        // This method is not inherited due to being static.
        // Because it is not inherited, it can't be what I want.
}

在寻址类 A 时,我可以做些什么来强制子类具有一个具有特定名称(和设定值)的静态最终字段?

事实上,我只想做以下事情:

我有一个名为

Component
的抽象类。我想制作一个从插件中获取其他类的程序。这些类应该从
Component
继承一些字段和方法。他们还应强制拥有静态 ID。现在的问题是:我如何强制类(由插件提供)具有这样的字段?

java inheritance static field final
1个回答
0
投票

我真的不知道如何强制 Java 编译器在编译时检查这个,
但它可以在运行时完成,使用反射 API:

public class MyClassA {

    static final Integer foo = 123;

    public MyClassA(){
        try {
            Field f = this.getClass().getDeclaredField("foo");
            int fooModifiers = f.getModifiers() ;
            if( fooModifiers != ( Modifier.FINAL | Modifier.STATIC ))
            {
                throw new RuntimeException("Each subclass of MyClassA must declare a field: static final Integer foo = value");
            }
        } catch ( SecurityException e) {
            e.printStackTrace();
        } catch ( NoSuchFieldException e ){
            throw new RuntimeException("Each subclass of MyClassA must declare a field: static final Integer foo = value", e);
        }
    }

    public static void main(String ... x){
        MyClassA m = new MyClassA();
    }
}

现在,如果不首先在该子类中声明一个字段,就无法实例化 MyClassA 的子类的对象:

final static Integer foo

public class MyClassB extends MyClassA{

    public static void main(String ... x){
        MyClassB m = new MyClassB();
        System.out.println("I am main");
    }

    // final Integer foo = 444;
    // final private Integer foo = 444;
    static Integer foo = 555;
    // static final Integer foo =333;
}
© www.soinside.com 2019 - 2024. All rights reserved.