我想知道當你需要爲了給定方法/另一個變量初始化工作而設置一個變量時,那些時間的默認方法是什麼。關於變量初始化順序
像這樣:
一切正常,如果我以後var B
初始化var A
。但不是相反。我寫了構造函數,所以我自己會這樣做,但我不確定測試var B
存在的代碼應該在哪裏。或者即使它應該存在,因爲我已經寫了構造函數並且初始化了我認爲合適的順序的值,但是我覺得它有點不安全,因爲它在任何情況下都不是很穩健。
請注意,我說的是實例變量,如果有幫助的話。
FA
我想知道當你需要爲了給定方法/另一個變量初始化工作而設置一個變量時,那些時間的默認方法是什麼。關於變量初始化順序
像這樣:
一切正常,如果我以後var B
初始化var A
。但不是相反。我寫了構造函數,所以我自己會這樣做,但我不確定測試var B
存在的代碼應該在哪裏。或者即使它應該存在,因爲我已經寫了構造函數並且初始化了我認爲合適的順序的值,但是我覺得它有點不安全,因爲它在任何情況下都不是很穩健。
請注意,我說的是實例變量,如果有幫助的話。
FA
答案可以用,爲什麼a
必須b
之前可以設置的原因的影響。
明確對象相關
如果原因是b
取決於a
,然後做最簡單的事情就是讓這種依賴性明確在那個b
創建的時間。例如,如果a
和b
爲對象,則:
var a = new A(...);
var b = new B(a, ...);
var op = new Operation(b);
op.perform();
通過這種方式,它是不可能初始化對象出故障了。請注意,A
和B
可能是新引入的包含對象的包含原始操作參數的對象。
流利接口
如果原因是,操作本身必須知道爲了在準備執行一些配置的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
。
我每次我訪問變量時前檢查,但如果是一個實例變量,你對你應該是安全的構造函數初始化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;
}