簡體   English   中英

自動 function 調用 Java

[英]Automatic function calling in Java

我正在研究 Java 中的 3D 游戲引擎的事件系統。 每種類型的事件都有自己的界面。 每次創建實現該接口的 object 時,我都想執行某些操作。 我知道接口不能有構造函數,但有什么方法可以執行這些操作嗎? 我不想在實現這些接口的類中執行這些操作,而且我不能將它們作為抽象類,因為每個 class 只能從一個父 class 擴展。

也許這個 apoarch 可以幫助:

public interface Action {
    
    void perform();

}


public interface Foo {
    
    final static Action action = new FooAction();

}


public interface Bar {
    
    final static Action action = new BarAction();

}


public class FooAction implements Action, Foo {

    public FooAction() {
    }

    @Override
    public void perform() {
        System.out.println("Performing FooAction");
    }

}


public class BarAction implements Action {

    public BarAction() {
    }

    @Override
    public void perform() {
        System.out.println("Performing BarAction");
    }

}


public class FooFighter implements Foo {

    public FooFighter() {
        System.out.println("FooFighter");
        action.perform();
    }

}


public class BarFighter implements Bar {

    public BarFighter() {
        System.out.println("BarFighter");
        action.perform();
    }

}


public class FighterTest {

    public void perform() {
        
        FooFighter fooFighter = new FooFighter();
        BarFighter barFighter = new BarFighter();
        
    } // perform

    public static void main(String[] args) {
        FighterTest self = new FighterTest();
        self.perform();
        
    }

}

Action 是接口上特定操作的通用句柄。 Foo 和 Bar 是持有特定動作處理程序類 FooAction 和 BarAction 的特定接口。

戰斗機類實現該特定接口並通過其構造函數中接口 Action 的方法 action.perform 觸發特定操作。 必須執行此調用,因為這是實例化請求的操作 class 的觸發器。 正如您在 FighterTest 中看到的那樣,其中實例化了兩個對象,每種類型一個。

此樣品的 output 是

FooFighter
Performing FooAction
BarFighter
Performing BarAction

正如我在評論中已經說過的那樣,當構造函數被開箱即用時,您無法自動執行任何代碼。 您基本上需要一些裝飾,即包裝您的構造函數並自動執行操作的代碼。

為此,有幾個選項,例如:

  • 使用像<T extends YourSpecialInterface> T createInstance(Class<T> type)這樣的工廠方法,這可能需要額外的配置或使用反射(注意:只有在你真的知道自己在做什么時才使用反射)。
  • 使用面向方面的編程 (AOP),即使用 AspectJ 之類的框架並攔截構造函數調用
  • 使用像 Spring 或 CDI 這樣的 DI 框架,讓它創建實例並注入它們或在需要的地方查找它們。 這基本上意味着 DI 框架知道何時創建實例,並且大多數支持一種“AOP light”,即您可以添加攔截器或生命周期方法。

您選擇哪個選項取決於幾個因素:

  • 工廠方法需要更多的工作,但使用起來更安全、更容易理解和更專業。
  • AOP 是最靈活的,但由於它是一種不同的編程范式,因此學習和正確操作非常復雜。
  • DI 框架是兩者之間的一種中間立場,即它們需要一些努力,例如將直接構造函數調用更改為注入/查找,由於“AOP 輕”而允許一些靈活性,但還需要很好地理解它們的工作原理以及何時使用它們,何時不使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM