如何找到Java接口的所有实现,而无需全部实例化

如何找到Java接口的所有实现,而无需全部实例化,java,android,interface,Java,Android,Interface,我在我的应用程序中为不同的“数据点”创建了一组接口。我希望能够以一种相当模块化的方式添加或删除“数据点”,并且只加载用户需要的数据点。目前,我只有一个所有类的列表,我通过一个ID访问我需要的类。我想用一些在添加DataPointMethods接口的实现时自动更新的东西来替换它,而不需要我立即实例化我所有的类,无论我是否需要它们。现在这不是一个大问题,但考虑到可伸缩性,我知道这将是一个大问题 当前代码: private void setupMethodsList() { dataPoint

我在我的应用程序中为不同的“数据点”创建了一组接口。我希望能够以一种相当模块化的方式添加或删除“数据点”,并且只加载用户需要的数据点。目前,我只有一个所有类的列表,我通过一个ID访问我需要的类。我想用一些在添加DataPointMethods接口的实现时自动更新的东西来替换它,而不需要我立即实例化我所有的类,无论我是否需要它们。现在这不是一个大问题,但考虑到可伸缩性,我知道这将是一个大问题

当前代码:

private void setupMethodsList() {
    dataPointMethodsList = new ArrayList<DataPointMethods>();

    dataPointMethodsList.add(WorkoutMethods.getInstance());
    dataPointMethodsList.add(SleepMethods.getInstance());
    dataPointMethodsList.add(WalkingMethods.getInstance());
    dataPointMethodsList.add(FoodMethods.getInstance());
    dataPointMethodsList.add(WeightMethods.getInstance());
    dataPointMethodsList.add(WaterMethods.getInstance());
}
虽然这可能是更好的性能方面,这是一种痛苦的维持


有没有更理想的解决方案?到目前为止,我发现的唯一解决方案涉及实例化所有内容,这与目的背道而驰……

如果您想要一个低维护的解决方案,您可以使用扫描类路径来获取实现接口的类的名称。然后可以使用反射从那里开始

    ClassPathScanningCandidateComponentProvider scanner =
            new ClassPathScanningCandidateComponentProvider(false);

    scanner.addIncludeFilter(new AssignableTypeFilter(DataPointMethods.class));

    for (BeanDefinition bd : scanner.findCandidateComponents("basepackage")) {
        Class<?> clazz = Class.forName(bd.getBeanClassName());
        DataPointMethodsmethod = (DataPointMethods)clazz.getMethod("getInstance").invoke(null);
    }
ClassPathScanningCandidateComponentProvider扫描仪=
新建ClassPathScanningCandidateComponentProvider(false);
addIncludeFilter(新的AssignableTypeFilter(DataPointMethods.class));
对于(BeanDefinition bd:scanner.findCandidateComponents(“basepackage”)){
Class clazz=Class.forName(bd.getBeanClassName());
DataPointMethodsmethod=(DataPointMethods)clazz.getMethod(“getInstance”).invoke(null);
}

您可以在该switch语句中传入枚举,而不是使用int。不太容易出错。我对Android开发相当陌生,所以我不完全确定如何使用反射。。。
    ClassPathScanningCandidateComponentProvider scanner =
            new ClassPathScanningCandidateComponentProvider(false);

    scanner.addIncludeFilter(new AssignableTypeFilter(DataPointMethods.class));

    for (BeanDefinition bd : scanner.findCandidateComponents("basepackage")) {
        Class<?> clazz = Class.forName(bd.getBeanClassName());
        DataPointMethodsmethod = (DataPointMethods)clazz.getMethod("getInstance").invoke(null);
    }