9
votes

Constructeur Scala Extra No-Arg Plus Paramètres de constructeur par défaut

J'utilise les paramètres par défaut SCALA 2.8 sur un constructeur et pour des raisons de compatibilité Java, je voulais un constructeur de no-arg pouvant utiliser les paramètres par défaut.

Cela ne fonctionne pas pour des raisons très sensibles: P >

class MyClass(field1: String = "foo", field2: String = "bar") {
    def this() = {
        this() // <-- Does not compile, but how do I not duplicate the defaults?
    }
}


2 commentaires

Il y a un billet à Lamsvn.epfl.ch/trac/scala/ticket/4278


J'ai parlé en faveur de ce billet à ma première rencontre de Scala dans la chair de toute la chair et j'ai dit que la chair était consommée par voravoure "ne pas ruiner la langue avec vos cas spéciaux" des loups. C'est chaque cas d'utilisation pour lui-même maintenant!


5 Réponses :


12
votes

Je ne le recommanderais pas vraiment, mais vous pouvez le faire en ajoutant un autre paramètre à votre constructeur: xxx

unité est un bon choix parce que vous pouvez Seulement transmettre une chose de toute façon, de manière explicite de manière explicite la valeur par défaut ne permet aucune possibilité d'erreur, et pourtant vous permet d'appeler le constructeur correct.

Si vous êtes prêt à reproduire juste Un des valeurs par défaut, vous pouvez utiliser la même stratégie, à l'exception de l'autre que l'on choisit par défaut plutôt que l'ajout du paramètre de l'unité.


1 commentaires

Je conviens que c'est dans l'esprit de ma question (minimiser la duplication), mais pas une bonne pratique. Merci d'avoir répondu!



4
votes

comme étant curieux de travail - autour du hack, et je fais piratage moyen strong>: vous pouvez utiliser la représentation interne des arguments par défaut:

class MyClass(field1: String = "foo", field2: String = "bar") { 
  def this() =  this(MyClass.init$default$1)
}


0 commentaires

4
votes

Vous pouvez envisager d'utiliser une méthode d'usine: xxx pré>

puis de Java, vous pouvez appeler myClass.NewDEfaultStance () code> p>

Une autre possibilité est Pour déplacer où vous spécifiez les valeurs par défaut: p>

class MyClass(field1: String, field2: String) {
  def this() = this(field1="foo", field2="bar")
}


1 commentaires

Merci pour les idées. Dans mon cas exactement, le premier ne fonctionnerait pas car il s'agit d'un servlet que j'imprimante (j'ai donc besoin du no-Arg.) La seconde est réalisable, mais je perds le comportement défaillant agréable dans les tests que les valeurs par défaut fournissaient . Je serais probablement tourné vers la première n'avait pas eu avaient besoin du constructeur de no-arg ...



0
votes

ne convient pas à toutes les fins, mais une sous-classe pourrait faire l'astuce: xxx


0 commentaires

0
votes

Si je ne me trompe pas dans la compréhension de la question, le code suivant a très bien fonctionné pour moi` xxx

`


0 commentaires