关于变量初始化顺序

时间:2011-11-03 00:13:10

标签: language-agnostic initialization

我想知道当你需要设置一个变量以便给定方法/另一个变量初始化工作时,默认方法是什么。

像这样:

如果我在 var A之后初始化var B ,那么一切正常。但不是相反。我编写了构造函数,所以我自己也会这样做,但我不确定测试var B存在的代码应该在哪里。或者即使它应该存在,因为我已经编写了构造函数并且按照我认为合适的顺序初始化值,但我觉得它有点不安全,因为如果有任何变化它不是很强大

请注意,我说的是实例变量,如果有帮助的话。

FA

2 个答案:

答案 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时使该依赖项显式化。例如,如果ab是对象,则:

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

这样,无法按顺序初始化对象。请注意,AB可能是新引入的包含原始操作参数的包装器对象。

流畅的界面

如果原因是操作本身必须知道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