web-dev-qa-db-fra.com

comment définir les valeurs par défaut des arguments de méthode?

Est-il possible de définir les valeurs par défaut des paramètres de méthode en Java?

Exemple: s'il existe une méthode

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

est-il possible de modifier la méthode donnée afin de pouvoir l'appeler avec et sans paramètres?

exemple:

doSomething(param1, param2);
doSomething();

Merci!

12
Niko Gamulin

Vous pouvez accomplir cela via surcharge de méthode.

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

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

En créant cette méthode sans paramètre, vous autorisez l'utilisateur à appeler la méthode parameterfull avec les arguments par défaut que vous fournissez dans l'implémentation de la méthode sans paramètre. C'est ce qu'on appelle surcharge la méthode.

48
Andrew Hare

Si vos arguments sont du même type, vous pouvez utiliser des 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
}

mais de cette façon, vous perdez la sémantique des arguments individuels, ou

avoir une méthode surchargée qui relaie l'appel à la version paramétrée

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

ou si la méthode fait partie d'une sorte de procédure d'initialisation, vous pouvez utiliser le modèle de générateur à la place:

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

Ensuite, travaillez avec l'objet Food

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

Le modèle de générateur vous permet d'ajouter/supprimer des paramètres plus tard et vous n'avez pas besoin de créer de nouvelles méthodes surchargées pour eux.

15
akarnokd

Non. Java ne prend pas en charge les paramètres par défaut comme C++. Vous devez définir une méthode différente:

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

Vous ne pouvez pas déclarer des valeurs par défaut pour des paramètres comme C # (je crois) vous le permet, mais vous pouvez simplement créer une surcharge.

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

Si vous allez faire quelque chose comme ça, merci à tous ceux qui travaillent avec votre code et assurez-vous de mentionner dans les commentaires Javadoc quelles sont les valeurs par défaut que vous utilisez!

3
matt b

Il n'est pas possible de définir des valeurs par défaut en Java. Ma façon préférée de gérer cela est de surcharge la méthode afin que vous puissiez avoir quelque chose comme:

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

  public int doSomething()
  {
    return doSomething(<default value>, <default value>);
  }
}
2
Nick Holt

Vous pouvez surcharger la méthode avec différents paramètres:

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

public int doSomething(
{
doSomething(0,0)
}
1
Savvas Dalkitsis

J'espère que je ne me méprends pas ce document , mais si vous utilisez Java 1.8, en théorie, vous pourriez accomplir quelque chose comme ça en définissant une implémentation fonctionnelle d'une méthode par défaut ( "méthodes de défense") dans une interface que vous implémentez.

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

Ensuite, appelez-le de toute façon:

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