在Java中是否可以设置默认的方法参数值?
例如: 如果有一个方法:
public int doSomething(int arg1, int arg2)
{
//some logic here
return 0;
}
有没有可能修改给定的方法,使其能够在有参数和无参数的情况下都可以调用?
例如:
doSomething(param1, param2);
doSomething();
谢谢!
在Java中是否可以设置默认的方法参数值?
例如: 如果有一个方法:
public int doSomething(int arg1, int arg2)
{
//some logic here
return 0;
}
有没有可能修改给定的方法,使其能够在有参数和无参数的情况下都可以调用?
例如:
doSomething(param1, param2);
doSomething();
谢谢!
你可以通过方法重载实现这一点。
public int doSomething(int arg1, int arg2)
{
return 0;
}
public int doSomething()
{
return doSomething(defaultValue0, defaultValue1);
}
通过创建这个无参数的方法,您可以允许用户使用在参数化方法实现中提供的默认参数来调用参数化方法。这被称为 重载 这个方法。
如果你的参数是相同类型的,你可以使用可变参数:
public int something(int... args) {
int a = 0;
int b = 0;
if (args.length > 0) {
a = args[0];
}
if (args.length > 1) {
b = args[1];
}
return a + b
}
但是这种方式会导致你失去单个参数的语义,或者
可以有一个重载的方法将调用转发到带参数版本
public int something() {
return something(1, 2);
}
如果该方法是某种初始化过程的一部分,你可以使用建造者模式:
class FoodBuilder {
int saltAmount;
int meatAmount;
FoodBuilder setSaltAmount(int saltAmount) {
this.saltAmount = saltAmount;
return this;
}
FoodBuilder setMeatAmount(int meatAmount) {
this.meatAmount = meatAmount;
return this;
}
Food build() {
return new Food(saltAmount, meatAmount);
}
}
Food f = new FoodBuilder().setSaltAmount(10).build();
Food f2 = new FoodBuilder().setSaltAmount(10).setMeatAmount(5).build();
然后与Food对象一起工作
int doSomething(Food f) {
return f.getSaltAmount() + f.getMeatAmount();
}
建造者模式允许你稍后添加或移除参数,而无需为它们创建新的重载方法。
不,Java不支持像C++那样的默认参数。您需要定义一个不同的方法:
public int doSomething()
{
return doSomething(value1, value2);
}
你不能像C#一样声明参数的默认值,但是你可以简单地创建一个重载函数。
public int doSomething(int arg1, int arg2) {
//some logic here
return 0;
}
//overload supplies default values of 1 and 2
public int doSomething() {
return doSomething(1, 2);
}
如果您要做类似的事情,请为与您的代码一起工作的其他人提供方便,确保在Javadoc注释中提到您使用的默认值!
Java 中无法设置默认值。我处理这个问题的做法是通过 重载 方法,例如:
public class MyClass
{
public int doSomething(int arg1, int arg2)
{
...
}
public int doSomething()
{
return doSomething(<default value>, <default value>);
}
}
您可以使用不同的参数重载该方法:
public int doSomething(int arg1, int arg2)
{
//some logic here
return 0;
}
public int doSomething(
{
doSomething(0,0)
}
希望我没有误解这份文档,但是如果你正在使用Java 1.8,理论上你可以通过在你实现的接口中定义默认方法("defender方法")的有效实现来实现这样的事情。
interface DoInterface {
void doNothing();
public default void remove() {
throw new UnsupportedOperationException("remove");
}
public default int doSomething( int arg1, int arg2) {
val = arg1 + arg2 * arg1;
log( "Value is: " + val );
return val;
}
}
class DoIt extends DoInterface {
DoIt() {
log("Called DoIt constructor.");
}
public int doSomething() {
int val = doSomething( 0, 100 );
return val;
}
}
DoIt d = new DoIt();
d.doSomething();
d.soSomething( 5, 45 );