Envoyé par
tchize_
Si les paramètres par défaut sont du sucre syntaxique uniquement, ça ne devrais pas poser de problème de compatibilité au niveau binaire:
Le problème c'est que cela ne fonctionne pas comme cela. Enfin dans C#, PHP ou d'autre langage qui les supportent.
Si Java reprenait le principe de C#, on aurait plutôt ceci :
public X maMethode(String val1, String val2 default "Hello", String val3 default "Prout"){....}
Qui serait compilé tel quel (les valeurs par défaut étant simplement des metadonnées, voir même des annotations) :
public X maMethode(String val1, @DefaultValue("Hello") String val2, @DefaultValue("Prout") String val3){....}
Et en fait ce serait les appels de méthodes qui serait modifiés via du sucre syntaxique.
Ainsi ceci :
1 2 3
| x.maMethode("a");
x.maMethode("a", "b");
x.maMethode("a", val3:"c"); |
Serait en réalité compilé en quelque chose comme cela :
1 2 3
| x.maMethode("a", "Hello", "Prout");
x.maMethode("a", "b", "Prout");
x.maMethode("a", "Hello", "c"); |
Du coup si tu rajoutes un paramètre optionnel comme ceci :
1 2
| // On veut rajouter un paramètre par défaut. Il semblerait évident de faire ceci :
public X maMethode(String val1, String val2 default "Hello", String val3 default "Prout", String val4 default "Test"){....} |
Les codes existant vont générer des MethodNotFoundException car maMethode(String,String,String) n'existe plus...
Pour pallier à cela il faut utiliser la surcharge en plus (ou éviter d'utiliser les paramètres par défaut dans les librairies) :
1 2 3 4 5 6 7
| // On rajoute un paramètre par défaut :
public X maMethode(String val1, String val2 default "Hello", String val3 default "Prout", String val4 default "Test"){....}
// Mais on doit conserver l'ancienne signature :
public X maMethode(String val1, String val2, String val3) {
return maMethode(val1, val2, val3, "Test");
} |
Bref on retombe un peu dans les mêmes travers
Sans compter les problèmes liés à l'héritage...
Ta solution serait adapté pour avoir seulement des paramètres optionnels... mais cela n'apporte rien de plus que ce qu'on a maintenant (si ce n'est qu'on ne voit pas les surcharges).
Comme tu le dis si tu veux spécifier uniquement le dernier paramètre il faut définir tous ceux qui le précède...
Et cela ne règle pas les problèmes liés à l'héritage...
Surtout que pour moi le principal intérêt de cela c'est d'éviter les builders ou les surcharges multiples pour des méthodes qui pourraient contenir plusieurs paramètres optionnels.
Il suffit de voir ResourceBundle.getBundle() qui possèdent seulement 4 paramètres (1 obligatoire + 3 optionnel) et qui propose 6 surcharges (et encore sans proposer toutes les alternatives possibles).
a++
Partager