2011-09-29 83 views
0

在Java中思考時,第566頁給出以下示例。關於說明通用類語法的用法的示例

class CountedInteger { 
    private static long counter; 
    private final long id = counter++; 
    public String toString() { return Long.toString(id); } 
} 
public class FilledList<T> { 
    private Class<T> type; 

    public FilledList(Class<T> type) { this.type = type; } 

    public List<T> create(int nElements) { 
    List<T> result = new ArrayList<T>(); 
    try { 
     for(int i = 0; i < nElements; i++) 
     result.add(type.newInstance()); 
    } catch(Exception e) { 
     throw new RuntimeException(e); 
    } 
    return result; 
    } 

    public static void main(String[] args) { 
    FilledList<CountedInteger> fl = new FilledList<CountedInteger>(CountedInteger.class); 
    System.out.println(fl.create(15)); 
    } 
} 

我對這個例子有三個問題。

1)什麼是私人類類型的用法?爲什麼是私人的?

2)爲什麼下面,特別是「this.type = type;」

public FilledList(Class<T> type) { this.type = type; } 

3)作者聲稱:

注意,這個類必須假設它的工作原理與 任何類型都有一個默認的構造函數(不帶參數),你會得到一個 如果情況並非如此,則例外。

我無法弄清楚這個聲明是如何反映在上面的例子中的。謝謝。

回答

1

1)它不是,但這是你在Java中做的事情之一 - 不要暴露不需要暴露的東西。

2)將屬性設置爲構造函數的參數 - 這是元素Java。

3)由於撥打type.newInstance();沒有默認的(無參數)構造函數,它會失敗。

0
  1. 它不一定是私人的,但通常最好是隱藏類中的內部字段,除非您希望它們可以從外部訪問。我也會在類型提交最後修改器,以防止修改。

  2. 此行將類構造函數中傳遞的值分配給名爲type的實例字段。關鍵字this表示它是一個此實例字段。

  3. 如果相應類型沒有默認構造函數,type.newInstance()代碼將失敗。

順便說一句,整件事可以用java.util.Collections.fill(list, value)來代替。

0
  1. type只是另一個實例變量。它被宣佈爲私人 ,以防止從此課程以外訪問它。

  2. 當創建FilledList這個類的一個實例,即,當 構造這需要1個ARG被調用時,實例變量type是 與在constuctor通過此ARG值initilized。

  3. type.newInstance()所做的是調用默認這種類型的無參數的構造 ,如果默認 構造函數是私有,這將拋出一個異常。

0

1:一個班級的所有成員都應該是私人的,或者對於information hiding受到保護。但你不必這樣做

2:在任何方法內部,您都可以訪問該類中的所有參數和所有成員變量。在這種情況下,參數名稱與成員變量完全相同。所以在這種情況下,如果您編寫type,參數名稱將會獲勝。 this指向當前實例,並且this.type表示您指的是成員變量而不是參數。所以this.type = type在這種情況下是member = parameter

3:newInstance沒有參數會調用T上的默認構造函數,如果它不存在,則會拋出異常。看看鏈接