Java泛型快速介紹 - Prakhar

banq發表於2022-03-29

假設編寫了以下類:

public class MessagePublisher extends AMQPublisher{
  public String message;
  public MessageEncoder messageEncoder;
  
  public MessagePublisher(String message) {
    super(); //Assume AMQPublisher has a NoArgs constructor
    
    this.message = message;
    this.messageEncoder = new MessageEncoder();
  }
  
  public void publishMessage() throws MessageEncodingException {
    final EncodedMessage encodedMessage = messageEncoder.encode(message);
    sendMessage(encodedMessage);
  }
}


現在,假設我們要為另一條訊息做同樣的事情,只是這次訊息不是字串型別,而是是整數、雙數或枚數?
我們是否需要再寫3到4個類,其中95%的程式碼都是一樣的?
不,只要你知道泛型。

以上述例子為例,我們將需要做一些修改:

public class MessagePublisher<T> extends AMQPublisher{
  public T message;
  public MessageEncoder messageEncoder;
  
  public MessagePublisher(T message) {
    super(); //Assume AMQPublisher has a NoArgs constructor
    
    this.message = message;
    this.messageEncoder = new MessageEncoder();
  }
  
  public void publishMessage() throws MessageEncodingException {
    final EncodedMessage encodedMessage = messageEncoder.encode(message);
    sendMessage(encodedMessage);
  }
}


你會注意到,我們已經把所有出現的String message替換成了T message,其中T是一個引數化的型別引用,與類名一起宣告。
注意:雖然我們把它看作是T,但你可以給它起任何名字 儘管社群中大多數人都使用T,所以保持這種方式是很好的,這樣如果有新的人進來檢視程式碼,他們就不會為一個不尋常的引數化型別符號而苦惱。

讓我們訪問同一個例子,看看如何使其發揮作用。

public class Main {
  
  static {
    final String stringMessage = "Message";
    final Integer intMessage = 5;
    final Float floatMessage = 5.0;
    
    MessagePublisher<String> stringMessagePublisher = new MessagePublisher<>(stringMessage);
    MessagePublisher<Integer> intMessagePublisher = new MessagePublisher<>(intMessage);
    MessagePublisher<Float> floatMessagePublisher = new MessagePublisher<>(floatMessage);
    
    List<MessagePublisher> messagePublisherList = new ArrayList<>();
    messagePublisherList.append(stringMessagePublisher);
    messagePublisherList.append(intMessagePublisher);
    messagePublisherList.append(floatMessagePublisher);
  }
  
  public static void main(String[] args) {
    // Publish all messages.
    messagePublisherList.stream().forEach(this::publishMessage);
  }
}


 

相關文章