java - 在Java中实例化大量子类的最有效方法?

标签 java class dynamic reflection loading

我正在开发一个项目,该项目需要使用大量扩展特定抽象类的类对象。手动实例化需要调用每个对象的单独构造函数,这开始污染我的客户端类。

该项目的原始代码太长,无法在此网站上发布,因此我在下面提供了一个简化的示例:

假设有一个名为 Letter 的抽象类:

public abstract class Letter{
    String letter;
}

以及扩展 Letter 抽象类的 26 个单独的字母类:

public class A extends Letter{
    this.letter = "A";
}

public class B extends Letter{
    this.letter = "B";
}
... and so on

这是我寻求帮助的地方 - 有一个名为 Alphabet 的客户端类:

public class Alphabet{
    public List<Letter> getLetters(){
        List<Letter> letters = new ArrayList<>();
        A a = new A();
        B b = new B();
        C c = new C();
        list.add(a);
        list.add(b);
        list.add(c);
        ...the list goes on

        return letters;
    }
}

如您所见,手动实例化每个字母并不理想。我正在寻找一种在运行时动态创建类对象列表的方法。

也许与此类似:

public class Alphabet{
    public List<Letter> getLetters(){
        List<Letter> letters = getAllClassesExtending(Letter.class);
        return letters;
        //list would then contain A,B,C,D,E,F,G, etc.
    }
}

我最终希望能够创建一个新类并将其自动添加到客户端类中的对象列表中,而无需修改客户端类(例如,我不想显式引用每个字母客户端类中的类)。

最佳答案

这听起来像是枚举的典型用例。 enum 的常量可以有一个包含代码的类体、重写基本类型的方法,甚至可以声明新字段。

获取所有子类型的实例的任务意味着一组封闭的子类型,它与enum类型的行为相匹配。

public enum Letter {
    A {
        @Override
        public boolean isVowel() {
            return true;
        }
    },
    B, C, D,
    E {
        @Override
        public boolean isVowel() {
            return true;
        }
    },
    F, G, H,
    I {
        @Override
        public boolean isVowel() {
            return true;
        }
    }, J, K, L, M, N,
    O {
        @Override
        public boolean isVowel() {
            return true;
        }
    }, P, Q, R, S, T,
    U {
        @Override
        public boolean isVowel() {
            return true;
        }
    }, V, W, X, Y, Z;
    ;
    String letter = name();

    public static List<Letter> getLetters() {
        return Arrays.asList(values());
    }

    public boolean isVowel() {
        return false;
    }
}

这表明重写方法是可能的,并且免费获取所有实例(作为数组)的方法。此外,名称本质上是指定的,没有冗余。

如果您想要一组开放的子类,以便在编译代码后进行潜在扩展,您应该查看 Service Provider conceptServiceLoader类(class)。此机制不会自动查找子类,而只会查找那些在 META-INF 中的文件中或通过模块声明声明为服务提供者的子类,另一方面,它为您提供了一个强大的、已建立的解决方案将由 Java 开发人员维护,甚至随平台一起发展,例如集成到新的模块概念中。

关于java - 在Java中实例化大量子类的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53399238/

相关文章:

java - 序列化收到的数据类型为 'LocalDateTime' 的 JSON 对象

java - 如何在叠加层中显示搜索结果页面

android - 动态创建 CheckBoxPreferences

java - 我可以在 Java 中执行此操作吗?

java - spring mvc中对象的绑定(bind)列表

java - 除了 Java 属性之外,还有其他方法可以保存树状数据吗?

java - 传递对象子类类型

java - 类必须声明为抽象或实现抽象方法错误

c++ - C 函数调用 C++ 成员函数 - C 代码是用 C 编译器编译的

javascript - 动态创建具有不同事件调用的按钮