Java 我可以在另一个构造函数中调用两个具有不同参数的构造函数吗

Java 我可以在另一个构造函数中调用两个具有不同参数的构造函数吗,java,constructor,Java,Constructor,我需要在另一个构造函数中调用一个构造函数2次。 例如: public class SpinnerUtilityAssociationComparison extends SpinnerUtilityBase { static String adminType = "Association"; public SpinnerUtilityAssociationComparison() { } public SpinnerUtilityAssociationComp

我需要在另一个构造函数中调用一个构造函数2次。 例如:

public class SpinnerUtilityAssociationComparison extends SpinnerUtilityBase {
    static String adminType = "Association";

    public SpinnerUtilityAssociationComparison() {
    }

    public SpinnerUtilityAssociationComparison(ArrayList sourceList, ArrayList asisList, 
            ArrayList targetList, ArrayList columnListSchema_1, ArrayList columnListSchema_2, 
            ArrayList columnListSchema_3, String foldername) throws Exception {
        this(sourceList, asisList, columnListSchema_1, columnListSchema_2, foldername, "Schema1_Schema2");
        this(asisList, targetList, columnListSchema_2, columnListSchema_3, foldername, "Schema1_Schema3");

        GenerateCompareReport(sourceList, asisList, targetList, str + "Spinner" + adminType + "Data_CompareReport.xls");
    }

    public SpinnerUtilityAssociationComparison(ArrayList sourceList, ArrayList asisList, 
            ArrayList columnListSchema_1, ArrayList columnListSchema_2, String foldername, 
            String packageName) throws Exception {

        // String str = foldername+"/Spinner" + adminType +"DataFiles/";
        String str1 = foldername + "/Spinner" + adminType + "DataFiles/Spinner" + adminType + "Data_" + packageName + "/";
        new File(str1).mkdirs();

        String unique1 = "Spinner" + adminType + "Data_Unique1.xls";
        String unique2 = "Spinner" + adminType + "Data_Unique2.xls";
        String delta = "Spinner" + adminType + "Data_Delta.xls";
        String match = "Spinner" + adminType + "Data_Match.xls";
        GenerateUniqueData_1(sourceList, asisList, columnListSchema_1, columnListSchema_2, str1 + unique1);

        GenerateUniqueData_2(sourceList, asisList, columnListSchema_1, columnListSchema_2, str1 + unique2);

        GenerateDeltaData(sourceList, asisList, str1 + delta);

        GenerateMatchData(sourceList, asisList, str1 + match);
    }
}
我必须用不同的参数调用单个构造函数。 在eclipse中,这会导致错误:构造函数调用必须是构造函数中的第一条语句。 我怎样才能做到这一点

那么我如何才能做到这一点

你不能,基本上-不是你正在尝试的方式。每个构造函数都精确地链接到同一类或直接超类中的另一个构造函数

我建议您创建一个“主”构造函数来完成所有需要的初始化,然后从所有其他构造函数链接到它(可能是间接的)。如果您在构造函数中进行非初始化工作,这本身就是一种设计味道,您应该重新审视您的设计


我还强烈建议您开始遵循Java命名约定。

编译器已经回答了这个问题:您不能以这种方式调用两个构造函数。请给一位顾客一张


我讨厌看到什么都不做的默认构造函数。要么在默认的ctor中做一些合理的事情,要么不提供一个。

你不能。编译器只接受一个构造函数调用,它是每个构造函数中的第一个调用。不过,在大多数情况下,您看不到,但编译器会添加它

public class MyClass { // is effectively 'public class MyClass extends Object'
    private String value;

    public MyClass() { // default constructor. Is it empty? Then don't add one
         this("hello"); // constructor chaining is possible though. 
    }

    public MyClass(String value) { //
        super(); // can be omitted, for it is a super() call to constructor of Object
        this.value = value; 
    }        
}

public class WrongClass {
    public WrongClass() {
        System.out.println("hello");
        this("hello"); // even this is impossible. It's not the first thing in your constructor
    }

    public WrongClass(String s) {
        super(); // implicitely called
    }
}
然而,在一个构造函数中调用两个构造函数并不是您的主要问题。似乎您只是想用一堆(原始类型的)
ArrayLists
做一堆事情。为什么不简单地让它们成为方法呢?这在语义上也更好,因为您不构造对象,但可以对所有这些对象执行一些操作。如果您只需调用一个方法,它就会编译并工作:

public SpinnerUtilityAssociationComparison(ArrayList sourceList, ArrayList asisList, 
        ArrayList targetList, ArrayList columnListSchema_1, ArrayList columnListSchema_2, 
        ArrayList columnListSchema_3, String foldername) throws Exception {
    doSomething(sourceList, asisList, columnListSchema_1, columnListSchema_2, foldername, "Schema1_Schema2");
    doSomething(asisList, targetList, columnListSchema_2, columnListSchema_3, foldername, "Schema1_Schema3");

    GenerateCompareReport(sourceList, asisList, targetList, str + "Spinner" + adminType + "Data_CompareReport.xls");
}

public doSomething(ArrayList sourceList, ArrayList asisList, 
        ArrayList columnListSchema_1, ArrayList columnListSchema_2, String foldername, 
        String packageName) throws Exception {
    /* do something with all those lists */
}
再说一遍,你不应该使用构造函数来做事情。您可以使用它们来构造对象,设置和初始化一些值,然后调用这些对象上的方法来实际执行操作

SpinnerUtilityAssociationComparison utilObject = new SpinnerUtilityAssociationComparison();
doSomething(sourceList, asisList, columnListSchema_1, columnListSchema_2, foldername, "Schema1_Schema2");

我很困惑。
GenerateCompareReport
GenerateUniqueData_1
GenerateUniqueData_2
的位置或内容是什么?+1表示“我还强烈建议您开始遵循Java命名约定。”!)(当然,因为这是一个很好的答案……)