如何在 java 中创建自上而下的重载构造函数

How to create a top-down overload constructor in java

我目前正在做一个 android 项目,我想在其中创建一个具有动态参数数量的对象。

一个 RequestOperation 对象将始终具有属性 Type 并且应该能够使用 0 到 3 个可选字符串属性创建,这些属性存储在名为 ArrayList<String> 的属性中=15=]。

在编写构造函数时,我想到了以下想法:

是否可以创建构造函数 "pesudo-recursive",以便采用三个字符串的构造函数方法将第三个字符串添加到对象并调用采用两个字符串的构造函数。这个会将第二个添加到对象中,然后调用采用一个字符串的构造函数,这将执行相同的操作,然后将填充了 requestParams arraylist 的对象传递给不采用字符串并仅添加的构造函数Type 属性。

这将使懒惰的程序员免于一遍又一遍地编写(实际上很长)构造函数。

这是我的想象(经过严格简化):

public class RequestOperation {

    public enum Type {
        //enum values and mappings
    }

    private String applicationUrl;
    private ArrayList<String> requestParams = new ArrayList<>();

    public RequestOperation(Type operationType) {
        this.applicationUrl = composeUrl(operationType, requestParams);
    }

    public RequestOperation(Type operationType, String paramFirst) {
        this.requestParams.add(0, paramFirst);
        new RequestOperation(operationType);
}

    public RequestOperation(Type operationType, String paramFirst, String paramSecond) {
        this.requestParams.add(0, paramSecond);
        new RequestOperation(operationType, paramFirst);
    }

    public RequestOperation(Type operationType, String paramFirst, String paramSecond, String paramThird) {
        this.requestParams.add(0, paramThird);
        new RequestOperation(operationType, paramFirst, paramSecond);
    }

恐怕使用这种方法,我会在构造函数中创建一个新对象,并且参数会被写入错误的对象。有没有办法将对象本身传递为以下构造函数调用的目标?如果这是一个糟糕的方法,请告诉我,我仍在学习如何正确编程。

可能更好的方法是为 class RequestOperation 定义一个静态方法,如 newInstance,它将 Type 对象和 List<String> 作为参数然后递归调用自身,直到 List 的长度为 0,然后它 returns 使用带有 Type 对象的构造函数创建的 RequestOperation。

我认为这是一种比您描述的方法更好的方法,因为您使用您的方法在每次递归调用时都创建了一个新的 RequestOperation 对象,我认为这不是一个很好的做法。

希望对您有所帮助!

您可以使用如下形式的可变参数:

public RequestOperation(Type operationType, String... parameters) {
    for(String param : parameters) {
       requestParams.add(param);
   }
}

这样做的额外好处是您还可以根据需要添加任意数量的请求参数。

编辑:正如 PPartisan 在评论中提到的,更简洁的方法是

public RequestOperation(Type operationType, String... parameters) {
   requestParams = Arrays.asList(parameters);
}