Как установить значения аргумента метода по умолчанию?
Можно ли установить значения параметра метода по умолчанию в Java?
Пример:
Если существует метод
public int doSomething(int arg1, int arg2)
{
//some logic here
return 0;
}
Можно ли изменить данный метод, чтобы иметь возможность называть его с параметрами и без них?
Пример:
doSomething(param1, param2);
doSomething();
Спасибо!
Ответы
Ответ 1
Вы можете выполнить это путем перегрузки метода.
public int doSomething(int arg1, int arg2)
{
return 0;
}
public int doSomething()
{
return doSomething(defaultValue0, defaultValue1);
}
Создав этот метод без параметров, вы разрешаете пользователю вызывать метод parameterfull с аргументами по умолчанию, которые вы предоставляете в рамках реализации метода без параметров. Это называется перегрузкой метода.
Ответ 2
Если ваши аргументы одного типа, вы можете использовать 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
}
но таким образом вы теряете семантику отдельных аргументов или
имеет перегруженный метод, который передает вызов параметризованной версии
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();
}
Рисунок построителя позволяет вам добавлять/удалять параметры позже, и вам не нужно создавать для них новые перегруженные методы.
Ответ 3
Нет. Java не поддерживает параметры по умолчанию, такие как С++. Вам нужно определить другой метод:
public int doSomething()
{
return doSomething(value1, value2);
}
Ответ 4
Вы не можете объявлять значения по умолчанию для таких параметров, как С# (я считаю), но вы можете просто создать перегрузку.
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, какие значения по умолчанию вы используете!
Ответ 5
Невозможно установить значения по умолчанию в Java. Мой предпочтительный способ справиться с этим - перегрузить метод, чтобы у вас было что-то вроде:
public class MyClass
{
public int doSomething(int arg1, int arg2)
{
...
}
public int doSomething()
{
return doSomething(<default value>, <default value>);
}
}
Ответ 6
Вы можете перегрузить метод различными параметрами:
public int doSomething(int arg1, int arg2)
{
//some logic here
return 0;
}
public int doSomething(
{
doSomething(0,0)
}
Ответ 7
Надеюсь, я не недопонимаю этот документ, но если вы используете Java 1.8, теоретически, вы могли бы сделать что-то вроде этого, определяя рабочий реализация метода по умолчанию ( "методы защитника" ) в рамках интерфейса, который вы реализуете.
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 );