在参数和继承中定义参数值

sil*_*ent 0 java multiple-inheritance default-value

我在使用某些Java时遇到问题,如何在Java中提供默认参数值?例如我在C ++中有这个

DVD(int i, string t, int y, string d="Unknown"): Items(i,t,y),director(d){} 在Java中,我尝试

public Dvd(int i, String t,int y, String d="Unknown"){
        super(i,t,y);
        director = d;
    }
Run Code Online (Sandbox Code Playgroud)

无法建立。那么我该如何提供默认值呢?

在我的主要测试课程中,我尝试给出3个参数,分别为4,但这也失败了。我如何解决这个问题?

pol*_*nts 5

不幸的是,Java不支持这样的默认参数构造。无论好坏,实现它的传统方法是使用所谓的“伸缩”方法。

这是来自有效Java 2nd Edition,项目2的引用:面对许多构造函数参数时,请考虑一个构造器模式

传统上,程序员使用伸缩构造函数模式,在这种模式下,您只为构造函数提供必需的参数,另一个为单个可选参数,第三个为两个可选参数,依此类推...

伸缩构造函数模式本质上是这样的:

public class Telescope {
    final String name;
    final int levels;
    final boolean isAdjustable;

    public Telescope(String name) {
        this(name, 5);
    }
    public Telescope(String name, int levels) {
        this(name, levels, false);
    }
    public Telescope(String name, int levels, boolean isAdjustable) {       
        this.name = name;
        this.levels = levels;
        this.isAdjustable = isAdjustable;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以执行以下任一操作:

new Telescope("X/1999");
new Telescope("X/1999", 13);
new Telescope("X/1999", 13, true);
Run Code Online (Sandbox Code Playgroud)

但是,您目前不能仅设置nameisAdjustable,并保留levels默认值。您可以提供更多的构造函数重载,但是显然,随着参数数量的增加,数量将激增,甚至可能会有多个booleanint参数,这实际上会使事情一团糟。

如您所见,这不是一个令人愉快的模式,而且使用起来也不那么令人愉快(“ true”在这里是什么意思?13是什么?)。

Bloch建议使用构建器模式,这将使您可以编写如下代码:

Telescope telly = new Telescope.Builder("X/1999").setAdjustable(true).build();
Run Code Online (Sandbox Code Playgroud)

请注意,现在参数已命名,您可以按所需的任何顺序设置它们,也可以跳过要保留为默认值的参数。这肯定比伸缩构造函数好得多,尤其是当存在大量属于许多相同类型的参数时。

因此Java没有默认参数机制,但是无论如何,构建器模式是一个更好的习惯用法。

也可以看看

相关问题