2011-03-25 35 views
7

有沒有辦法找出帶有可變參數的Java函數(或構造函數)是否實際使用可變參數或數組調用?Java:找出函數是否用可變參數或數組調用

說我有以下幾點:

public class MyCompositeObjects { 

    MyObject[] objects; 

    MyCompositeObjects(MyObjects... objects) { 
     this.objects = Arrays.copyOf(objects,objects.length); 
     // or just: this.objects = objects; ? 
    } 

    // ... 
} 

構造可以與單個MyObject[]的說法,它可以在以後更改被調用,如果我沒有在構造函數中的數組複製這些更改將適用於成員變量objects,對吧?但是,如果構造函數被調用了幾個MyObject,那麼沒有其他引用可以在類的後面更改它,所以我可以直接指定它。我可以告訴構造函數(或者,通常,任何使用可變參數的函數)它是如何被調用的?

* nb:有沒有一個特定的名字?它只是一個匿名數組嗎?

回答

9

不,你不能。它的意思是完全透明的 - 這樣的代碼:

new MyCompositeObjects(a, b); 

完全等同於

new MyCompositeObjects(new MyObjects[] { a, b }); 

如果你能信任來電者做正確的事情,你總是可以創建兩個靜態方法和使構造函數爲私有:

public static MyCompositeObjects createWithCopy(MyObjects[] values) { 
    return new MyCompositeObjects(Arrays.copyOf(values, values.length)); 
} 

public static MyCompositeObjects createWithoutCopy(MyObjects... values) { 
    return new MyCompositeObjects(values); 
} 

private MyCompositeObjects(MyObjects[] values) { 
    this.objects = values; 
} 

請注意「帶有複製」版本如何不使用可變參數,這應該可以幫助用戶使用正確的版本。

4

要知道的唯一方法是解析代碼。這是因爲可變參數基本上是編譯時功能,並不會改變程序的運行方式。

如果有疑問,我會一直複製數組。除非你知道這將是一個性能問題。

順便說一句:你可以做到以下幾點。

MyCompositeObjects(MyObjects o1, MyObjects... objects) { 

MyCompositeObjects(MyObjects[] objects) { 

但是,這可能會做你想要的相反。

另一種選擇是使用靜態工廠。

private MyCompositeObjects(MyObjects[] objects) { 
    this.objects = objects; 
} 

MyCompositeObjects create(MyObjects... objects) { 
    return new MyCompositeObjects(objects.close()); 
} 

MyCompositeObjects createNotCopied(MyObjects... objects) { 
    return new MyCompositeObjects(objects, false); 
} 

對不太安全的版本使用更麻煩的方法名稱。這意味着如果選擇一種方法時沒有太多想法,安全版本更有可能被使用。

+0

您的靜態工廠示例中存在問題。 「copy」布爾值不是構造函數參數,而是對objects.close()的調用。 – 2011-03-25 15:18:45

相關問題