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,但这也失败了。我如何解决这个问题?
不幸的是,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)
但是,您目前不能仅设置name和isAdjustable,并保留levels默认值。您可以提供更多的构造函数重载,但是显然,随着参数数量的增加,数量将激增,甚至可能会有多个boolean和int参数,这实际上会使事情一团糟。
如您所见,这不是一个令人愉快的模式,而且使用起来也不那么令人愉快(“ true”在这里是什么意思?13是什么?)。
Bloch建议使用构建器模式,这将使您可以编写如下代码:
Telescope telly = new Telescope.Builder("X/1999").setAdjustable(true).build();
Run Code Online (Sandbox Code Playgroud)
请注意,现在参数已命名,您可以按所需的任何顺序设置它们,也可以跳过要保留为默认值的参数。这肯定比伸缩构造函数好得多,尤其是当存在大量属于许多相同类型的参数时。
因此Java没有默认参数机制,但是无论如何,构建器模式是一个更好的习惯用法。
| 归档时间: |
|
| 查看次数: |
272 次 |
| 最近记录: |