我想知道当你需要设置一个变量以便给定方法/另一个变量初始化工作时,默认方法是什么。
像这样:
如果我在 var A
之后初始化var B
,那么一切正常。但不是相反。我编写了构造函数,所以我自己也会这样做,但我不确定测试var B
存在的代码应该在哪里。或者即使它应该存在,因为我已经编写了构造函数并且我按照我认为合适的顺序初始化值,但我觉得它有点不安全,因为如果有任何变化它不是很强大
请注意,我说的是实例变量,如果有帮助的话。
FA
答案 0 :(得分: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;
}
答案 1 :(得分:1)
答案可能会受到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
可能是新引入的包含原始操作参数的包装器对象。
流畅的界面
如果原因是操作本身必须知道a
的值才能执行某些配置以准备b
的到来,那么操作构造函数可以替换为{{ 3}}:
Operation op = Operation.withA(a).withB(b);
op.perform();
我们必须注意定义这个流畅的界面,只有在withB
被调用后才能调用withA
。例如:
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
的状态。请注意Operation
的构造函数如何对客户端代码不可见,并且在withB
被调用之后才能调用withA
。