簡體   English   中英

Java泛型 - 使用泛型接口及其實現的最佳方式

[英]Java Generics - Best way to use generic interface and its implementation

我有一個接口 MessageHandler,它采用泛型類型 T 和一個在具體類型 CustomObject 上操作的實現 MessageHandlerImpl。 然后我在另一個客戶端類中使用它,如下所示:

public interface MessageHandler<T> { 

    void validate(T t);
    
    void process(T t);
    
    default void handle(T t) {
        validate(t);
        process(t);
    }
}

public class MessageHandlerImpl implements MessageHandler<CustomObject> {

    @Override
    public void validate(CustomObject message) {}
        
    @Override
    public void process(CustomObject message) {}
}

public class AnotherClientClass {
    
    //option - 1
    MessageHandlerImpl handler = new MessageHandlerImpl();
    //option - 2
    MessageHandler<CustomObject> handler = new MessageHandlerImpl();

    public void getMessage() {
        String messageStr = getMessageFromAnotherMethd();
        CustomObject messageObj = convertToCustomObject(messageStr);
        
        handler.handle(messageObj);
    }
}

我在這里有幾個問題:

  1. 根據最佳開發實踐,選項 1 是否良好,我認為不是,因為我們使用具體類型作為參考變量?
  2. Option-2 看起來很合適,但在這里我必須再次聲明類型 (CustomObject),我覺得這是額外的負擔,因為 MessageHandlerImpl 已經這樣做了,我錯過了什么嗎?

泛型在這里無關緊要。 通常使用與選擇適當的聲明變量類型相同的准則。

更廣泛地說,通過調用new ,你的設計很糟糕。 相反,使handler成為構造函數參數。 在這種情況下,一定要使用超類型MessageHandler<CustomObject> (或者,甚至更好, MessageHandler<? super CustomObject>甚至Consumer<? super CustomObject> )。

暫無
暫無

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

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