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
    }

}