2015-05-11 57 views
3

考慮到與最終私人領域_bar類:使用可選參數爲最終專用字段設置默認實例的最佳方法是什麼?

class Foo() { 

final Bar _bar; 

    Foo({Bar bar}) : _bar = bar { 

     //error: list cannot be used as setter, it is final 
     _bar = new Bar(); 
    } 

} 

試圖將其設置在參數列表導致此錯誤

//error: default values of an object must be constant 
Foo({Bar bar: new Bar()}) : _bar = bar .. 

我想保持可選參數,以便我能在單元測試中注入模擬。什麼是最好的方法呢?

回答

3

class Foo { 
    final Bar _bar; 
    Foo({Bar bar}) : _bar = bar != null ? bar : new Bar(); 
} 
+0

不知道。將有趣的是允許它在初始化列表中,但不作爲默認值。 –

+0

主要區別在於當你使用'null'設置可選參數時。使用默認值,該字段將等於'null',儘管該初始化程序列表將等於'new Bar()' –

+1

這不是我的意思。我很好奇爲什麼在初始化器列表中允許非const值,但不是默認值。 –

1

我建議使用靜態方法當邏輯是複雜的事情。

class Foo { 
    final Object _field1; 

    Foo({Object value1}) : this._field1 = _setUpField1(value1); 

    static Object _setUpField1(Object value) { 
    // Some complex logic 
    return value; 
    } 
} 
相關問題