在重载的构造函数中重用代码

时间:2011-09-21 10:05:57

标签: java oop constructor

我的BigBlock类需要一些重载的构造函数。所有这些都需要以相同的方式初始化相同的几个字段。

这样做的正确方法是什么?它是否是一个功能,例如在下面的例子中,Initialize执行这些操作,并让所有构造函数调用该函数吗?

public class BigBlock {
    private Thing parentThing;
    Units lengthUnit;
    LabCoordinateSystem labCoordinateSystem;

    private void Initialize(){
        lengthUnit = parentThing.getPreferredUnits(0);
        labCoordinateSystem = parentThing.getCoordinateSystem();
    }

    BigBlock(Thing myThing){
        parentThing= myThing;
        Initialize();
    }

    BigBlock(Thing myThing, double x, double y, double z){
        parentThing= myThing;
        Initialize();
        // more code involving x, y, z
    }

    // a few more constructors

}

4 个答案:

答案 0 :(得分:22)

通常情况下,最好将所有构造函数链接到包含最多信息的单个构造函数,例如

BigBlock(Thing myThing) {
    this(myThing, 0, 0, 0); // Assuming 0 is the default value for x, y and z
}

如果有不同的方法来调用有效地表示相同信息的子集的构造函数,它会变得稍微怪异 - 但是在那一点上我会说有一种设计气味。< / p>

请注意,当您在单个构造函数中获得所有真实逻辑时,您不需要Initialize方法(应该initialize遵循Java命名约定,顺便说一句)在所有情况下 - 也可能 你可以将字段设为最终字段,这是以前你无法做到的。

答案 1 :(得分:3)

只需重用当前的构造函数即可。让其他每个构造函数调用初始化所有必需值的构造函数。

BigBlock(Thing myThing){
    parentThing = myThing;
    lengthUnit = parentThing.getPreferredUnits(0);
    labCoordinateSystem = parentThing.getCoordinateSystem();

}

BigBlock(Thing myThing, double x, double y, double z){
    this(myThing);
    // more code involving x, y, z
}

如果xyz需要成为初始化的一部分,BigBlock(Thing myThing)应使用默认值调用BigBlock(Thing myThing, double x, double y, double z)

答案 2 :(得分:2)

否 - 你可以使用它从构造函数中调用其他构造函数。

BigBlock(Thing myThing) {
  this(myThing,0,0,0); // Pass default values for other constructors
}

答案 3 :(得分:1)

几乎总是如此,'这是......的正确/最佳方式'的答案是“依赖”。

如果Initialize背后的逻辑专门与对象创建相关联,并且Thing在所有创建方面都很常见,那么您可以通过在最简单的构造函数上插入该行为并在每个构造函数中使用它来对其进行建模。另外一个。这将仅在一个地方集中使用初始化行为。

BigBlock(Thing myThing){
    parentThing= myThing;
    Initialize();
}

BigBlock(Thing myThing, double x, double y, double z){
    this(myThing);
    // more code involving x, y, z
}

在其他情况下,将Initialize作为单独的方法可能很有用。例如,如果initialize执行了一些可重用的逻辑,那么就像对象上的“重置”一样,你可能会在与对象创建不同的时刻调用它。