La surcharge est-elle vraiment le seul moyen d'obtenir des valeurs par défaut pour les paramètres de méthode en Java?

StackOverflow https://stackoverflow.com/questions/618276

  •  03-07-2019
  •  | 
  •  

Question

Je connais assez bien Java, mais depuis Python et PHP, je suis habitué aux valeurs par défaut des paramètres de fonction.

J'ai donc l'habitude d'écrire des méthodes conçues pour être appelées à partir de situations légèrement différentes, dans lesquelles vous ne souhaitez définir que certaines valeurs. Par exemple, dans mon code PHP, cela serait courant lorsque j'ai des méthodes d'usine qui fournissent des instances d'objet avec des propriétés légèrement différentes.

En Java, il me semble qu’il me faut une méthode qui attend tous les paramètres, puis plusieurs variantes surchargées qui appellent cette méthode avec certains des paramètres définis par défaut et ceux fournis par l’appelant. Ce qui est, eh bien, d'accord, mais peut parfois m'énerver.

Je me souviens que cela m'ennuyait déjà lors de brèves excursions en C ++ et ActionScript. Maintenant, les développeurs Java les plus expérimentés ont-ils un raccourci pour cela?

Il me semble que, sur le plan technique, la question a été résolue par la somme de tous les messages, ainsi: "Oui, c'est". J'ai ouvert un article wiki ci-dessous pour rassembler les différentes solutions alternatives. Merci de contribuer si vous le souhaitez. J'ai trouvé toutes ces informations très utiles en tant qu'inspiration et exemples d'apprentissage de constructions Java typiques.

Était-ce utile?

La solution 6

Il semble que "Oui, c’est", sauf que:

Des variantes différentes pourraient produire des effets similaires. Paul Whelan ou en définissant un type supplémentaire portant les paramètres sous forme de champs avec les valeurs par défaut appropriées suggérées par Jon Skeet. Boris Pavlovic ajoute que son type pourrait être une classe statique interne pour garder les choses parfaitement au bon endroit.

Inconvénients (Notez que toute cette question ne concerne pas d’implications sérieuses, mais des ajustements pratiques):

Les varargs semblent plus appropriés pour passer une liste de valeurs de longueur variable ayant une forme très similaire et une signification généralement équivalente, telle qu'une liste de noms. Si elle est utilisée aux fins énoncées dans la question, la méthode devrait effectuer diverses vérifications sur la liste afin de l’interpréter, ce qui semble non pas plus, mais moins pratique.

Un type spécial portant les paramètres semble plus utile si le type obtenu peut avoir d'autres utilisations que d'être simplement passé à une méthode particulière ou s'il s'agit d'un ensemble de paramètres plus complexe. S'il y a 2 à 4 paramètres et que certains peuvent avoir des valeurs par défaut, il semble un peu plus pratique de surcharger, mais cela pourrait être une question de goût personnel.

Autres conseils

Une autre option est une variante du modèle de construction: vous avez un type qui représente tous les paramètres, vous construisez une instance de ce type (la valeur par défaut correspondante), définissez les propriétés souhaitées, puis transmettez le résultat à la méthode d'origine. , ou ajoutez une méthode dans le "type de paramètre". appeler la méthode pour vous.

Vous pouvez le voir en action dans les bibliothèques standard, avec le ProcessBuilder et Traiter classes.

voir varargs

http : //www.java-tips.org/java-se-tips/java.lang/using-the-varargs-language-feature.html

(URL mise à jour; ce commentaire a été ajouté car stackoverflow requiert 30 caractères>)

Pour simplifier les choses, j'ai créé une annotation pour les valeurs par défaut et un processeur d'annotation qui génère une super-classe avec les méthodes surchargées. Par exemple:

protected void process(
    Processor processor,
    String item,
    @Default("Processor.Size.LARGE") Size size,
    @Default("red") String color,
    @Default("1") int quantity) {
        ...
}

qui génère (dans une superclasse générée)

protected void process(sample.Processor processor, java.lang.String item)  {
    process(processor, item, Processor.Size.LARGE, "red", 1);
}
protected void process(sample.Processor processor, 
                       java.lang.String item, 
                       sample.Processor.Size size)  {
    process(processor, item, size, "red", 1);
}
protected void process(sample.Processor processor, 
                       java.lang.String item, 
                       sample.Processor.Size size, 
                       java.lang.String color)  {
    process(processor, item, size, color, 1);
}
protected abstract void process(sample.Processor processor, 
                                java.lang.String item, 
                                sample.Processor.Size size, 
                                java.lang.String color, 
                                int quantity) ;

Voir http://code.google.com/p/javadude/wiki/ Annotations - Scott

Il peut être très difficile d’essayer de traduire votre processus d’une langue à l’autre. Comme d'autres l'ont déjà souligné, vous pouvez peut-être trouver ce que vous voulez, mais plus tôt vous accepterez " la façon dont Java est conçu pour fonctionner mieux vous le serez lorsque vous travaillerez en Java.

J'ai dû faire des choses en PHP ... m'a énervé de ne pas pouvoir le faire faire ce que je voulais ... donc ça va dans les deux sens.

Le plus gros obstacle que vous allez rencontrer est probablement le typage statique. Il y a des choses que vous pouvez essayer de faire pour contourner cela, mais à la fin, ce sera un très gros bidouillage.

Au début du C ++, les gens essayaient de convaincre le C ++ de se comporter comme Smalltalk ... ça n'a pas très bien fonctionné. Dans les premiers temps, si les utilisateurs de Java essayaient d'exploiter leurs connaissances en C ++ et de les utiliser en Java ... cela ne fonctionnait pas très bien (ce qui est d'autant plus frustrant que les langages sont très similaires à la surface).

Mon conseil: pour votre code Java, apprenez à programmer comme un développeur Java plutôt que comme un développeur PHP.

Pour votre problème immédiat, est-il possible que vous deviez vraiment réaccorder des classes différentes de la fabrique au lieu de créer le même type d'objet avec des variables différentes définies?

Tant que vous codez de manière OO, vous ne manquerez pas les valeurs par défaut en Java. Les arguments par défaut ne sont utiles que dans le style de codage procédural.

Dans OO au lieu de passer l'état via les méthodes / procédures, l'état se trouve déjà dans l'objet que vous appelez, ou les objets que vous transmettez en tant que paramètres. La plupart du temps, vous n'avez pas besoin de plus de 1 ou 2 paramètres dans vos méthodes.

Si vous voulez configurer votre objet avant de l’utiliser, vous le construiriez avec un simple constructeur, puis vous appelleriez différents setters. Cela rend le code beaucoup plus lisible (parce que vous voyez les noms de setter), comparé à l'appel d'un constructeur ayant plusieurs arguments. Et si un nouvel attribut arrive plus tard, vous pouvez l'ajouter à votre objet sans avoir à modifier vos méthodes d'usine existantes.

Oui, par exemple, c'est la surcharge qui est le seul moyen d'utiliser le paramètre par défaut en java. Mais voici le hack pour vous. Si vous utilisez la surcharge et que vous voulez avoir un paramètre par défaut. Ensuite, vous finirez par

public void methodA(A arg1) { }
public void methodA( B arg2,) { }
public void methodA(C arg3) { }
public void methodA(A arg1, B arg2) { }
public void methodA(A arg1, C arg3) { }
public void methodA( B arg2, C arg3) { }
public void methodA(A arg1, B arg2, C arg3) { }

Mais en utilisant varargs

public class DefaultValue
{
 public static void main(String[] args)
  {
       defaultParameter();
       defaultParameter(true);
  }

  public static void defaultParameter(Boolean …gender)
  {
       boolean genderBoolean = false; // It is the default value you want to give
       if(1 == gender.length)
       {
            genderBoolean = gender[0]; // Overrided Value
      }
       System.out.println(genderBoolean);
 }
}

Le code ci-dessus sera généré

false
true

Pour obtenir des exemples et des explications plus simples, visitez le site de java-default-parameter-values ??

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top