Zum Inhalt springen
Anjunar/ DOCS

Konstruktoren und Parameter

Jeder Konstruktor kommt mit seinen Parametern: Name, Typ, Annotationen und ob es einen Default gibt. Das braucht eine Factory, um einen Konstruktor ohne Raten aufzurufen.

Parameter

Namen, Typen und Defaults

hasDefault sagt, ob ein Aufrufer einen Parameter weglassen darf. Der primäre Konstruktor ist markiert; sekundäre Konstruktoren stören nicht.

number
java.lang.String
amount
scala.math.BigDecimal · has default
currency
java.lang.String · has default
scala
case class Invoice(number: String, amount: BigDecimal = BigDecimal(0), currency: String = "EUR") val primary = ReflectMacros.reflect[Invoice].constructors.find(_.isPrimary).get primary.parameters.map(parameter => parameter.name -> parameter.hasDefault)
Mehrere Konstruktoren

Primär und sekundär

Eine Klasse mit Hilfskonstruktoren listet sie alle. isPrimary unterscheidet sie, parameterNames und parameterCount beschreiben jeden.

(x, y)
primary
scala
class Point(val x: Int, val y: Int) { def this(both: Int) = this(both, both) } ReflectMacros.reflect[Point].constructors.map(c => c.parameterNames.toList -> c.isPrimary)
Erzeugen

Von Parametern zur Instanz

Der Deskriptor beschreibt, er ruft nicht auf. Case Classes erzeugst du mit createInstance, andere Klassen über eine an den Deskriptor gebundene Factory.

ReflectMacros.createInstance[Invoice]("R-1", BigDecimal(90), "EUR")
Invoice(R-1,90,EUR)
Defaults werden nicht eingesetzt

hasDefault sagt, dass es einen Default gibt, und defaultIndex, welchen; createInstance braucht trotzdem jedes Argument. Übergib die Werte selbst, wenn du Instanzen aus unvollständigen Eingaben baust.