我遇到了一些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个参数,但这也失败了。我该如何解决这个问题?。
答案 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);
但是,您目前无法仅设置name
和isAdjustable
,并且默认保留levels
。你可以提供更多的构造函数重载,但显然随着参数数量的增加,数字会爆炸,你甚至可能有多个boolean
和int
参数,这实际上会让事情搞得一团糟。 / 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
)...