2009-06-24 7 views
12

Czy można ustawić domyślne wartości parametrów metod w Javie?jak ustawić domyślne wartości argumentów metody?

przykład: Jeśli jest sposób

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

możliwe jest zmodyfikowanie danych sposób, aby być w stanie wywołać go bez parametrów?

przykład:

doSomething(param1, param2); 
doSomething(); 

Dzięki!

+4

zasadzie taki sam, jak ten: '? Czy wsparcia Java domyślne wartości parametrów' http://stackoverflow.com/questions/997482/does -java-support-default-parameter-values ​​ – Jonik

Odpowiedz

8

Nie. Java nie obsługuje domyślnych parametrów, takich jak C++. Trzeba zdefiniować inną metodę:

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

Można to osiągnąć poprzez metoda przeciążenia.

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

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

Tworząc tę ​​metodę bez parametrów jesteś pozwalając użytkownikowi wywołać metodę parameterfull z argumentów domyślnych Państwo zaopatrują w realizacji metody bez parametrów. Jest to znane pod nazwą przeciążania metody:.

+0

To właśnie używam :) –

3

Nie można zadeklarować wartości domyślnych dla parametrów takich jak C# (uważam, że) pozwala, ale można po prostu po prostu stworzyć przeciążenie.

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

Jeśli masz zamiar zrobić coś takiego wszystkim proszę nie kto pracuje z kodem przysługę i upewnij się, wspominając w Javadoc komentarze jakie wartości domyślne używasz są!

+0

C# nie pozwala na użycie parametrów opcjonalnych lub domyślnych. Językami, które to robią są na przykład C++ i python. – kgiannakakis

1

Można przeciążać metody z różnymi parametrami:

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

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

Jeśli twoje argumenty są tego samego typu można użyć varargs:

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 
} 

ale w ten sposób można stracić semantyki poszczególnych argumentów lub

mieć przeciążoną metodę, która przekazuje połączenie do wersji o zmienionym parametrze

public int something() { 
    return something(1, 2); 
} 

lub jeśli metoda jest częścią jakiejś procedury inicjalizacji, można użyć wzoru budowniczy Zamiast:

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

następnie pracować z obiektem Food

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

Wzór Builder pozwala możesz później dodawać/usuwać parametry i nie musisz tworzyć dla nich nowych przeciążonych metod.

+0

+1 za wzmiankę o wzorze konstruktora. –

+0

+1 za używanie varargs, rzadko widzę programistów używających go. – ajduke

2

Nie można wartości domyślnych w Javie.Mój ulubiony sposób na radzenie sobie z tym jest przeciążenia zastosowano metodę więc może masz coś takiego:

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

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

Mam nadzieję, że nie jestem nieporozumienie this document, ale jeśli używasz Java 1.8, w teorii, można osiągnąć coś podobnego poprzez zdefiniowanie działającej implementacji domyślnej metody ("metody obrony") w ramach implementowanego interfejsu.

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

Następnie nazwać to tak czy inaczej:

DoIt d = new DoIt(); 
d.doSomething(); 
d.soSomething(5, 45);