2009-06-24 78 views
12

是否有可能建立在Java中的默认方法的参数值?如何设置默认的方法的参数值?

示例: 如果有一个方法

public int doSomething(int arg1, int arg2) 
{ 
//some logic here 
    return 0; 
} 

是有可能修改该给定的方法,以便能够使用和不使用参数来调用它?

例如:

doSomething(param1, param2); 
doSomething(); 

谢谢!

+4

基本相同,因为这一个: '?是否支持Java默认参数值',http://stackoverflow.com/questions/997482/does -java-support-default-parameter-values – Jonik 2009-06-24 17:03:06

回答

8

号Java不支持默认参数,如C++。您需要定义不同的方法:通过方法重载

public int doSomething() 
{ 
    return doSomething(value1, value2); 
} 
43

你可以做到这一点。

public int doSomething(int arg1, int arg2) 
{ 
     return 0; 
} 

public int doSomething() 
{ 
     return doSomething(defaultValue0, defaultValue1); 
} 

通过创建这个参数方法您允许用户调用parameterfull方法与您提供的参数方法的实现中的默认参数。这被称为超载的方法。

+0

这就是我使用的:) – 2009-06-24 13:51:14

3

你不能声明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中提到评论你使用的是默认值!

+0

C#不允许你使用可选参数或默认参数。这样做的语言是例如C++和python。 – kgiannakakis 2009-06-24 13:42:30

1

可以重载不同参数的方法:

public int doSomething(int arg1, int arg2) 
{ 
//some logic here 
     return 0; 
} 

public int doSomething(
{ 
doSomething(0,0) 
} 
15

如果你的论点是同一类型的,你可以使用可变参数:

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(); 

然后与食物对象

int doSomething(Food f) { 
    return f.getSaltAmount() + f.getMeatAmount(); 
} 

Builder模式允许工作您可以添加/稍后删除参数,你不需要为他们创造新的重载方法。

+0

+1提建筑者模式。 – 2009-06-24 16:20:57

2

这是不可能为默认在Java中值。我来处理这个首选的方法是超载的方法,所以你可能有类似:

public class MyClass 
{ 
    public int doSomething(int arg1, int arg2) 
    { 
    ... 
    } 

    public int doSomething() 
    { 
    return doSomething(<default value>, <default value>); 
    } 
} 
1

但愿我不是误解this document,但如果你使用Java 1.8,从理论上讲,你可以做到像这是通过在你实现的接口中定义一个默认方法的工作实现(“defender methods”)。

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