簡體   English   中英

沒有泛型的代碼重用

[英]Code reuse without generics

假設我需要創建3個鏈接列表,一個用於int,一個用於Strings,一個用於其他類型的自定義對象。 如果我使用的是泛型,只需創建一個鏈接列表即可輕松實現,但是如果我不使用泛型,是否可以避免3次編寫相同的重復代碼?

如果您使用Integer而不是int ,那么可以。 在這種情況下,所有三個對象都是Object子類,因此您的Linked List類只能處理Object

該代碼大致如下所示:

class MyLinkedList{
    public void add(Object){...}
    public Object remove(Object){...}
    ...
}

在Java 1.5中引入泛型之前,Collections都使用Object類型,因此您將擁有一個Objects鏈表。 然后,您必須確保自己要添加,檢索和轉換正確的類型。

我看不到為什么不應該或不應該使用泛型的任何原因,因為不再需要或不建議使用Java 1.4。

您不能對ints vs Strings使用相同的代碼,但是假設您的意思是Integers,則必須創建一個存儲java.lang.Objects的LinkedList,順便說一句,這是基於通用的LinkedLists所做的。

您可以將鏈表處理的類型抽象為您自己的類型,例如StringOrIntOrCustom ,該類型具有每種類型之一,並帶有一個標志,該標志指定要使用的有效類型。 但是,您需要進行大量檢查,以確保您沒有在每次使用此數據類型時都執行該類型不支持的操作。

您可以在沒有泛型的情況下完成此操作,但是您將無需進行編譯時類型安全檢查,而必須手動添加所有類型轉換。

但是話又說回來,您將基本上執行使用泛型時編譯器的工作。 現在,它只是容易出錯和手動的。

是的,您可以做到,而且並不難。

abstract class ListNode {
   public ListNode next_;
};

interface ListNodeFactory {
   public ListNode createListNode();
}

然后,您創建一個操作ListNode對象的List類。 當需要一個新的ListNode時,它將調用一個函數來創建一個新的ListNode。 add方法將使用ListNodeFactory參數。 我建議大多數方法都應protected因為不是派生類的任何客戶端都不可能使用它。

您將為每種類型從List創建一個派生類。 您將必須使用一種采用所需類型的方法來包裝每個方法。 您還必須創建一個ListNodeFactory實現,該實現將創建具有適當類型的新列表節點。 為了獲取數據,它還必須將從遍歷或刪除中獲取的ListNode對象轉換為適當的類型。 這是一個例子:

class IntListNode extends ListNode {
   public int data_;
   public IntListNode(int x) {
      data_ = x;
   }
}

class IntListNodeFactory implements ListNodeFactory {
   IntListNodeFactory() {
       nextdataset_ = false;
   }
   IntListNodeFactory(int x) {
       nextdataset_ = true;
       data_ = x;
   }
   void setNextData(int x) {
       nextdataset_ = true;
       nextdata_ = x;
   }
   public ListNode createListNode() {
       if (!nextdataset_) {
          throw Exception("Tried to create a node with no data!");
       } else {
          ListNode result = new IntListNode(data_);
          nextdataset_ = false;
          return result;
       }
   }
}

暫無
暫無

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

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