2011-11-03 64 views
1

我想知道當你需要爲了給定方法/另一個變量初始化工作而設置一個變量時,那些時間的默認方法是什麼。關於變量初始化順序

像這樣:

一切正常,如果我以後var B初始化var A。但不是相反。我寫了構造函數,所以我自己會這樣做,但我不確定測試var B存在的代碼應該在哪裏。或者即使它應該存在,因爲我已經寫了構造函數並且初始化了我認爲合適的順序的值,但是我覺得它有點不安全,因爲它在任何情況下都不是很穩健。

請注意,我說的是實例變量,如果有幫助的話。

FA

回答

1

答案可以用,爲什麼a必須b之前可以設置的原因的影響。

明確對象相關

如果原因是b取決於a,然後做最簡單的事情就是讓這種依賴性明確在那個b創建的時間。例如,如果ab爲對象,則:

var a = new A(...); 
var b = new B(a, ...); 
var op = new Operation(b); 
op.perform(); 

通過這種方式,它是不可能初始化對象出故障了。請注意,AB可能是新引入的包含對象的包含原始操作參數的對象。

流利接口

如果原因是,操作本身必須知道爲了在準備執行一些配置的b到來的a值,則操作的構造可以通過fluent interface取代:

Operation op = Operation.withA(a).withB(b); 
op.perform(); 

我們必須注意這樣的方式withA被稱爲後withB只能叫來定義這個流暢的界面。例如:

public class Operation { 

    private final C _c; 
    private final B _b; 

    private Operation(C c, B b) { 
     _c = c; 
     _b = b; 
    } 

    public static BStep withA(final A a) { 
     return new BStep() { 
      public Operation withB(B b) { 
       C c = setUpStateDependentUponA(a); 
       return new Operation(c, b); 
      } 
     }; 
    }; 

    public interface BStep { 
     Operation withB(B b); 
    } 

    public void perform() { 
     // do something with _c and _b 
    } 

} 

這裏,C已被引入到捕獲狀態取決於a單獨之前的b到來。請注意0​​的構造函數對於客戶端代碼而言是不可見的,並且只有在調用了withA後才能調用withB

1

我每次我訪問變量時前檢查,但如果是一個實例變量,你對你應該是安全的構造函數初始化B中。我使用的東西喜歡 -

if (isset(var B) 
{ do something with var A } 
else 
{ error handler } 

try 
    { 
     if (isset(var B)) 
      do something with a; 
     else 
      throw new Exception("attribute B has not been set."); 
    } 
    catch (Exception $e) 
    { 
     echo $e->getMessage(); 
     return NULL; 
    }