Language agnostic 关于变量初始化顺序
我想知道当您需要设置一个变量以使给定方法/另一个变量初始化工作时,默认的方法是什么 像这样: 如果在Language agnostic 关于变量初始化顺序,language-agnostic,initialization,Language Agnostic,Initialization,我想知道当您需要设置一个变量以使给定方法/另一个变量初始化工作时,默认的方法是什么 像这样: 如果在var B之后初始化var A,一切都会正常工作。但不是相反。我编写了构造函数,所以我会自己编写,但我不确定测试var B存在的代码应该在哪里。或者,即使它应该存在,因为我已经编写了构造函数,并且按照我认为合适的顺序初始化了值,但是我觉得它有点不安全,因为它在任何变化的情况下都不是很健壮 请注意,如果有帮助的话,我说的是实例变量 FA每次访问变量之前,我都会进行检查,但是如果它是一个实例变量,并且
var B
之后初始化var A
,一切都会正常工作。但不是相反。我编写了构造函数,所以我会自己编写,但我不确定测试var B
存在的代码应该在哪里。或者,即使它应该存在,因为我已经编写了构造函数,并且按照我认为合适的顺序初始化了值,但是我觉得它有点不安全,因为它在任何变化的情况下都不是很健壮
请注意,如果有帮助的话,我说的是实例变量
FA每次访问变量之前,我都会进行检查,但是如果它是一个实例变量,并且您在构造函数中初始化了B,那么您应该是安全的。我用的是-
if (isset(var B)
{ do something with var A }
else
{ error handler }
或
答案可能受到以下原因的影响:
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
的到来做准备,那么操作构造函数可以替换为:
我们必须注意定义这个流畅的接口,使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
来捕获在b
到达之前仅依赖于a
的状态。注意操作的构造函数如何对客户端代码不可见,并且在调用with a
之前,不可能调用with b
Operation op = Operation.withA(a).withB(b);
op.perform();
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
}
}