Java接口实现-自动初始化程序

时间:2019-06-05 12:02:58

标签: java interface automation implementation

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

public interface MyInterface {

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

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

    void method1();

    void method2();

}

我希望在初始化接口时(例如如果调用 init 方法),将创建实现该接口的每个类的新实例,并将其添加到ArrayList中。

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

有这种可能吗?

3 个答案:

答案 0 :(得分:1)

使用Interface类代替使用abstract。此外,在该类内部,创建一个参数构造函数,该构造函数接受您的抽象类作为参数。然后在构造函数中,可以将该参数添加到ArrayList中。

然后,在主类内部,您可以使用org.reflections创建扩展您的abstract类的所有类的实例。然后调用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();
    }
}

答案 1 :(得分:0)

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

它将在这些方面提供一些帮助

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

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

答案 2 :(得分:0)

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

Article that explains the idea in more detail
article about MgntUtils library
Package description in javadoc that explains in detail how to use the feature
Full Javadoc
Github with library including sources and javadoc
Maven Central with all versions of the library