Je suis tombé sur du code Java qui avait la structure suivante:
public MyParameterizedFunction(String param1, int param2)
{
this(param1, param2, false);
}
public MyParameterizedFunction(String param1, int param2, boolean param3)
{
//use all three parameters here
}
Je sais qu'en C ++, je peux attribuer à un paramètre une valeur par défaut. Par exemple:
void MyParameterizedFunction(String param1, int param2, bool param3=false);
Java prend-il en charge ce type de syntaxe? Y a-t-il des raisons pour lesquelles cette syntaxe en deux étapes est préférable?
public MyParameterizedFunction(String param1, int param2)
est une déclaration de constructeur, pas de méthode.Réponses:
Non, la structure que vous avez trouvée est la façon dont Java la gère (c'est-à-dire avec surcharge au lieu des paramètres par défaut).
Pour les constructeurs, reportez -vous à Astuce 1 du Guide de langage de programmation efficace (Considérez les méthodes d'usine statiques au lieu des constructeurs) si la surcharge devient compliquée. Pour d'autres méthodes, renommer certains cas ou utiliser un objet paramètre peut aider. C'est lorsque vous avez suffisamment de complexité que la différenciation est difficile. Un cas précis est celui où vous devez différencier en utilisant l'ordre des paramètres, pas seulement le nombre et le type.
la source
static
tout ce qui est à peu près considéré comme nuisible en 2015. Tapez desBuilder
instances fluides sûres qui appliquent des contrats de construction complets et valides sont une bien meilleure solution maintenant.new
. Ils sont utilisés tout le temps dans un nouveau code. Les constructeurs d'objets de valeur simples sont souvent le résultat d'une ingénierie excessive.Non, mais vous pouvez utiliser le modèle de générateur , comme décrit dans cette réponse Stack Overflow .
Comme décrit dans la réponse liée, le modèle de générateur vous permet d'écrire du code comme
dans lequel certains champs peuvent avoir des valeurs par défaut ou être facultatifs.
la source
Student s1 = new Student().age(16);
cela vous laisserait avec un étudiant sans nom, ce qui pourrait être mauvais. Si ce n'est pas mauvais, alors votre solution est très bien.Il existe plusieurs façons de simuler les paramètres par défaut en Java:
Surcharge de méthode.
L'une des limites de cette approche est qu'elle ne fonctionne pas si vous avez deux paramètres facultatifs du même type et que l'un d'eux peut être omis.
Varargs.
a) Tous les paramètres facultatifs sont du même type:
b) Les types de paramètres facultatifs peuvent être différents:
Le principal inconvénient de cette approche est que si les paramètres facultatifs sont de types différents, vous perdez la vérification de type statique. De plus, si chaque paramètre a une signification différente, vous avez besoin d'un moyen de les distinguer.
Nulls. Pour remédier aux limites des approches précédentes, vous pouvez autoriser les valeurs nulles, puis analyser chaque paramètre dans un corps de méthode:
Maintenant, toutes les valeurs des arguments doivent être fournies, mais celles par défaut peuvent être nulles.
Classe facultative. Cette approche est similaire aux valeurs null, mais utilise la classe facultative Java 8 pour les paramètres qui ont une valeur par défaut:
Facultatif rend explicite un contrat de méthode pour un appelant, cependant, on peut trouver une telle signature trop verbeuse.
Modèle de générateur.Le modèle de générateur est utilisé pour les constructeurs et est implémenté en introduisant une classe de générateur distincte:
Plans.Lorsque le nombre de paramètres est trop important et que la plupart d'entre eux sont généralement utilisés par défaut, vous pouvez passer des arguments de méthode sous forme de mappage de leurs noms / valeurs:
Veuillez noter que vous pouvez combiner n'importe laquelle de ces approches pour obtenir un résultat souhaitable.
la source
return this
faire? De plus,FooBuilder().setA("a").build();
puisque (par définition) le constructeur est appelé en premier etFooBuilder()
renvoie une valeur, cela ne signifie-.setA("a"):
t-il pas qu'il n'a pas la chance d'être appelé?return this
renvoie le même objet sur lequel la méthode a été appelée (dans l'exemple,FooBuilder
). Cela permet de chaîner des méthodes dans une instruction agissant sur le même objet:new FooBuilder().setA(..).setB(..).setC(..)
etc, au lieu d'appeler chaque méthode dans une instruction distincte.new FooBuilder()
renvoie unFooBuilder
objet sur lequel lasetA
méthode est appelée. CommesetB
n'est pas appelé,this.b
conserve la valeur par défaut. Enfin labuild
méthode est appelée sur cetFooBuilder
objet. Labuild
méthode crée et renvoie unFoo
objet qui est défini sur la variableFoo foo
. Notez que l'FooBuilder
objet n'est stocké dans aucune variable.Malheureusement non.
la source
Malheureusement oui.
pourrait être écrit en Java 1.5 comme:
Mais si vous devez ou non dépendre de ce que vous pensez du compilateur générant un
pour chaque appel.
Pour plusieurs paramètres par défaut:
pourrait être écrit en Java 1.5 comme:
Cela correspond à la syntaxe C ++, qui autorise uniquement les paramètres par défaut à la fin de la liste des paramètres.
Au-delà de la syntaxe, il existe une différence dans le cas où le type d'exécution a vérifié les paramètres par défaut passés et le type C ++ les vérifie lors de la compilation.
la source
assert
code en production. Jetez une exception.Non, mais vous pouvez très facilement les émuler. Ce qui était en C ++ était:
En Java, ce sera une fonction surchargée:
Plus tôt, il a été mentionné que les paramètres par défaut provoquaient des cas ambigus de surcharge de fonctions. Ce n'est tout simplement pas vrai, nous pouvons le voir dans le cas du C ++: oui, il peut peut-être créer des cas ambigus, mais ces problèmes peuvent être facilement traités. Il n'a tout simplement pas été développé en Java, probablement parce que les créateurs voulaient un langage beaucoup plus simple que le C ++ - s'ils avaient raison, c'est une autre question. Mais la plupart d'entre nous ne pensent pas qu'il utilise Java en raison de sa simplicité.
la source
Vous pouvez le faire dans Scala, qui s'exécute sur la JVM et est compatible avec les programmes Java. http://www.scala-lang.org/
c'est à dire
la source
Non , mais la façon la plus simple de mettre en œuvre ceci est:
ou au lieu de l' opérateur ternaire , vous pouvez utiliser
if
:la source
Je dirais peut-être l'évidence ici, mais pourquoi ne pas simplement implémenter le paramètre "par défaut" vous-même?
pour la valeur par défaut, vous utiliserez soit
et si vous ne souhaitez pas utiliser la valeur par défaut, vous utiliserez
la source
//This is better public class Foo() { /* This does something */ public void func(String s){ //do something } /* This does something else with b */ public void func(String s, boolean b){ // b was passed } }
//Than this public class Foo() { /* This does something unless b = value, then it does something else */ public void func(String s, boolean b = value){ If (b){ // Do Something } else{ // Do something else } } }
Comme Scala a été mentionné, Kotlin mérite également d'être mentionné. Dans la fonction Kotlin, les paramètres peuvent également avoir des valeurs par défaut et ils peuvent même faire référence à d'autres paramètres:
Comme Scala, Kotlin fonctionne sur la JVM et peut être facilement intégré dans des projets Java existants.
la source
Non.
Vous pouvez obtenir le même comportement en passant un objet qui a des valeurs par défaut intelligentes. Mais encore une fois, cela dépend de votre cas.
la source
Non. En général, Java n'a pas (beaucoup) de sucre syntaxique, car ils ont essayé de créer un langage simple.
la source
const
etgoto
seraient réservés des mots clés qui ne sont pas mis en œuvre? - Surtoutconst
quelque chose qui me manque amèrement -final
ne remplace pas et ils le savaient. - Et si vous avez pris la décision consciente de ne jamais l'implémenter,goto
vous n'aurez pas besoin de réserver le mot-clé. - Et plus tard dans l'équipe Java triché en rendant le Label basébreak
etcontinue
aussi puissant qu'un Pascalgoto
.À la place d'utiliser:
Vous pouvez utiliser la fonctionnalité facultative de java en ayant une seule méthode:
La principale différence est que vous devez utiliser des classes wrapper au lieu de types Java primitifs pour autoriser l'
null
entrée.Boolean
au lieu deboolean
,Integer
au lieu deint
et ainsi de suite.la source
Il n'est pas pris en charge mais il existe plusieurs options comme l'utilisation d'un modèle d'objet de paramètre avec du sucre de syntaxe:
Dans cet exemple, nous construisons
ParameterObject
avec des valeurs par défaut et les remplaçons dans la section d'initialisation d'instance de classe{ param1 = 10; param2 = "bar";}
la source
Essayez cette solution:
la source
Vous pouvez utiliser Java Method Invocation Builder le générateur d' pour générer automatiquement le générateur avec des valeurs par défaut.
Ajoutez simplement @GenerateMethodInvocationBuilder à la classe ou à l'interface et le @Default aux paramètres dans les méthodes où vous souhaitez des valeurs par défaut. Un générateur sera généré au moment de la compilation, en utilisant les valeurs par défaut que vous avez spécifiées avec vos annotations.
Et puis vous pouvez invoquer les méthodes.
Ou définissez l'une des valeurs par défaut sur autre chose.
la source
Une approche similaire à https://stackoverflow.com/a/13864910/2323964 qui fonctionne dans Java 8 consiste à utiliser une interface avec des getters par défaut. Ce sera plus d'espaces verbeux, mais est moquable, et c'est génial lorsque vous avez un tas d'instances où vous voulez réellement attirer l'attention sur les paramètres.
la source
J'ai maintenant passé pas mal de temps à comprendre comment utiliser cela avec des méthodes qui retournent des valeurs, et je n'ai vu aucun exemple jusqu'à présent, j'ai pensé qu'il pourrait être utile d'ajouter ceci ici:
la source
Voici comment je l'ai fait ... ce n'est peut-être pas aussi pratique que d'avoir un `` argument facultatif '' contre votre paramètre défini, mais cela fait le travail:
Remarquez que je peux invoquer le même nom de méthode avec juste une chaîne ou que je peux l'invoquer avec une chaîne et une valeur booléenne. Dans ce cas, définir wipeClean sur true remplacera tout le texte de mon TextArea par la chaîne fournie. Définir wipeClean sur false ou le laisser de côté tout simplement ajoute le texte fourni à TextArea.
Notez également que je ne répète pas le code dans les deux méthodes, j'ajoute simplement la fonctionnalité de pouvoir réinitialiser le TextArea en créant une nouvelle méthode avec le même nom uniquement avec le booléen ajouté.
En fait, je pense que c'est un peu plus propre que si Java fournissait un «argument facultatif» pour nos paramètres, car nous aurions alors besoin de coder pour les valeurs par défaut, etc. Dans cet exemple, je n'ai pas à me soucier de tout cela. Oui, j'ai ajouté une autre méthode à ma classe, mais c'est plus facile à lire à long terme à mon humble avis.
la source
NON, mais nous avons une alternative sous la forme d'une surcharge de fonction.
appelé quand aucun paramètre n'est passé
appelé lorsqu'un paramètre "a" a été transmis
appelé lorsque le paramètre b est passé
la source
Il y a une demi-douzaine ou mieux de problèmes comme celui-ci, finalement, vous arrivez au modèle d'usine statique ... consultez l'API crypto pour cela. Trier difficile à expliquer, mais pensez-y de cette façon: si vous avez un constructeur, par défaut ou autre, la seule façon de propager l'état au-delà des accolades est soit d'avoir un isValid booléen; (avec le null comme valeur par défaut v constructeur échoué) ou lève une exception qui n'est jamais informative lors du retour des utilisateurs sur le terrain.
Code correct, bon sang, j'écris des milliers de constructeurs de lignes et je fais ce dont j'ai besoin. Je trouve que l'utilisation d'isValid dans la construction d'objets - en d'autres termes, les constructeurs à deux lignes - mais pour une raison quelconque, je migre vers le modèle d'usine statique. Il me semble que vous pouvez faire beaucoup de choses si vous dans un appel de méthode, il y a toujours des problèmes de synchronisation () mais les valeurs par défaut peuvent être mieux "substituées" (plus sûres)
Je pense que ce que nous devons faire ici est de résoudre le problème de null comme valeur par défaut vis-à-vis de quelque chose String one = new String (""); en tant que variable membre, puis en vérifiant la valeur null avant d'attribuer la chaîne passée au constructeur.
Très remarquable la quantité d'informatique brute et stratosphérique réalisée à Java.
C ++ et ainsi de suite a des bibliothèques de fournisseurs, oui. Java peut les distancer sur des serveurs à grande échelle car il s'agit d'une énorme boîte à outils. Étudiez les blocs d'initialisation statiques, restez avec nous.
la source
Il n'est pas pris en charge en java comme dans d'autres langues par exemple. Kotlin.
la source
Vous pouvez utiliser les éléments suivants-
la source