[英]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.