Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java接口实现-自动初始化器_Java_Interface_Automation_Implementation - Fatal编程技术网

Java接口实现-自动初始化器

Java接口实现-自动初始化器,java,interface,automation,implementation,Java,Interface,Automation,Implementation,我想知道是否有可能使特定接口的任何实现在接口本身初始化时自动执行特定操作。如下所示: public interface MyInterface { public static final ArrayList<MyInterface> IMPLEMENTATIONS = new ArrayList<>(); public static void init(){ // Somecode... } void method1(

我想知道是否有可能使特定接口的任何实现在接口本身初始化时自动执行特定操作。如下所示:

public interface MyInterface {

    public static final ArrayList<MyInterface> IMPLEMENTATIONS = new ArrayList<>();

    public static void init(){
        // Somecode...
    }

    void method1();

    void method2();

}
公共接口MyInterface{
公共静态最终ArrayList实现=新建ArrayList();
公共静态void init(){
//一些代码。。。
}
void方法1();
void方法2();
}
我希望在初始化接口时,比如调用init方法,然后创建实现接口的每个类的新实例,并将其添加到ArrayList中

这样做的目的是基本上有一个单一的程序,可以启动我编写的任何其他程序。基本上,它是在计算机启动时启动的,然后可以用来启动我编写的任何其他程序,而不必将每个新程序添加到系统自动启动文件夹中


这样做可能吗?

不要使用
接口
,而是使用
抽象
类。此外,在该类中,创建一个单参数构造函数,该构造函数接受抽象类作为参数。然后在构造函数中,您可以在
ArrayList
中添加该参数

然后,在main类中,可以使用创建扩展
抽象类的所有类的实例。然后调用
init
方法,在该方法中可以对列表执行操作

public class MyClass{
  private static final List<MyClass> IMPLEMENTATIONS = new ArrayList<>();
  public MyClass(MyClass myClass){
    IMPLEMENTATIONS.add(myClass);
  }
  public static void init(){
    // Do something with IMPLEMENTATIONS
  }
  abstract void method1();

  abstract void method2();

}

package com.mypackage; 
public class Child extends MyClass{
  public Child(){
    super(this);
  }
  // Implement other abstract methods
}

public class MyMainClass{
  public static void main(String[] args) throws IllegalAccessException, InstantiationException { 
    Reflections reflections = new Reflections("com.mypackage"); 
    Set<Class<? extends MyClass>> classes = reflections.getSubTypesOf(MyClass.class); 
    for (Class<? extends MyClass> aClass : classes){ 
      aClass.newInstance(); 
      }
    MyClass.init();
    }
}
公共类MyClass{
私有静态最终列表实现=新建ArrayList();
公共MyClass(MyClass MyClass){
add(myClass);
}
公共静态void init(){
//对实现做些什么
}
抽象无效方法1();
抽象方法2();
}
package com.mypackage;
公共类子类扩展了MyClass{
公共儿童(){
超级(本);
}
//实现其他抽象方法
}
公共类MyMainClass{
公共静态void main(字符串[]args)抛出IllegaAccessException,实例化Exception{
反射=新反射(“com.mypackage”);

设置除了Manish的答案之外,如果您已经从类继承了;您可以使用外部方法,通过多态性初始化从接口继承的实例

它将围绕这些线提供一些信息:

public class MyInterfaceFactory {
    public static void initializeElements( MyInterface _element ) {
        MyInterface.IMPLEMENTATIONS.add( _element );
    }
}

或者您可以在每个实现类的构造函数中添加数组。

您的问题太笼统,无法给出具体的答案。但是,(如果我理解正确的话)我编写了一个开源库MgntUtils,其中包含一个具有自填充工厂功能的小框架。简而言之,它的工作原理是:您可以扩展框架提供的工厂,并编写自己的接口来扩展框架提供的接口。然后编写几个类来实现您的接口,一旦类的构造函数称为每个类都将自身插入工厂,因此,一旦程序启动(例如Spring Boot或Spring framework)启动类,工厂就会完全初始化并准备好使用。这里有相关的库链接和文章,解释其思想和用途:








我不明白你想要什么。你不能初始化接口,只能初始化类。这不是100%正确,接口有点“初始化”,其中的任何静态变量都是赋值的。我想知道的是,从一个不相关的类中,以某种方式了解实现我拥有的特定接口的每个类。您必须专门调用init。接口不能有静态{}块。对于您的其他要求,如果您想使用spring库(不一定是容器),您可能想看看这个:或者实现类似于您自己的东西;-)@Anju你的意思是你想让所有类的实例在运行时实现一个特定的接口?这是最有效的。它仍然需要手动创建每个实现类。我不想专门这么做。@Anjumaka你的意思是创建一个实现类吗?我想你可以在f上创建一个实现实例但是,我不确定这一点。如果是,您可以创建一个工厂类/方法来提供实例,而不必创建类。