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

2022-09-04 06:25:12

我的类需要一些重载构造函数。它们都需要以相同的方式初始化相同的几个字段。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

}

答案 1

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

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

如果有不同的方式来调用构造函数,而这些构造函数不能有效地表示相同信息的子集,那么它就会变得有点奇怪 - 但是在这一点上,我会说无论如何都有设计气味。

请注意,当你在单个构造函数中获得所有真正的逻辑时,你根本不需要你的方法(顺便说一句,这应该遵循Java命名约定) - 这也可以使字段最终完成,这在以前是你无法做到的。Initializeinitialize


答案 2

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

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
}

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