参数和继承中的默认参数值

时间:2010-05-27 04:50:37

标签: 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;
    }

无法构建。那么我该如何给出默认值?

同样在我的主要测试类中,我尝试给出3个参数,其中4个参数,但这也失败了。我该如何解决这个问题?。

4 个答案:

答案 0 :(得分:4)

不幸的是,

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

以下是 Effective Java 2nd Edition的引用,第2项:在面对许多构造函数参数时考虑构建器模式

  

传统上,程序员使用 telescoping构造函数模式,在该模式中,您只提供构造函数所需的参数,另一个使用单个可选参数,第三个使用两个可选参数,依此类推。 ..

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

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;
    }
}

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

new Telescope("X/1999");
new Telescope("X/1999", 13);
new Telescope("X/1999", 13, true);

但是,您目前无法仅设置nameisAdjustable,并且默认保留levels。你可以提供更多的构造函数重载,但显然随着参数数量的增加,数字会爆炸,你甚至可能有多个booleanint参数,这实际上会让事情搞得一团糟。 / p>

正如你所看到的,这不是一个令人愉快的写作模式,使用起来也不那么令人愉快(“真实”在这里意味着什么?13是什么?)。

Bloch建议使用一个构建器模式,这样你就可以编写类似这样的内容:

Telescope telly = new Telescope.Builder("X/1999").setAdjustable(true).build();

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

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

另见

相关问题

答案 1 :(得分:3)

Java无法指定默认参数值,但是您可以通过执行以下操作来实现相同的效果(在这种情况下,您希望a2的默认值为true

public void aMethod(boolean a1)
{
    aMethod(a1, true);
}

public void aMethod(boolean a1, boolean a2)
{
    // your code here
}

所以在你的情况下,你应该重载Dvd类构造函数,使其具有不带参数的版本,以及带参数的版本,其中没有将默认值传递给带有参数的版本。

答案 2 :(得分:1)

可能是你可以重载构造函数并再试一次

public Dvd(int i, String t,int y, String d ){
        super(i,t,y);
        director = d;
    }


public Dvd(int i, String t,int y){
        super(i,t,y);
        director = "Unknown";
    }

答案 3 :(得分:0)

正如其他人所提到的,Java没有默认参数值,这可以通过创建多个构造函数来克服。

但是,有一个名为varargs的特殊构造,它允许您拥有等效的默认值,但它只能用于方法调用中的最后一个参数,并且所有这些都必须是相同类型。

还有可用于实现类似结果的构建器模式,例如:new Dvd().setI(i).setY(y)...