Formatschablonen werden von einem einfachen Mechanismus verwendet, der die Änderung des Formats der Ausgabezeichenfolge einer generierten Methode ermöglicht, nämlich Anfang, Ende, Trennzeichen usw. Sie sehen ähnlich wie JDT-Codeschablonen aus, wirken sich jedoch nicht direkt auf den generierten Code aus (dafür werden Codedarstellungen verwendet). Die folgenden Schablonenvariablen sind verfügbar:
${object.className} | Fügt den Klassennamen als einfache Zeichenfolge ein. |
${object.getClassName} | Fügt einen Aufruf von this.getClass.getName() ein. |
${object.superToString} | Fügt einen Aufruf von super.toString() ein. |
${object.hashCode} | Fügt einen Aufruf von this.hashCode() ein. |
${object.identityHashCode} | Fügt einen Aufruf von System.identityHashCode(this) ein. |
${member.name} | Fügt den Namen für das erste Member ein. |
${member.name()} | Fügt den Namen für das erste Member gefolgt von runden Klammern (bei Methoden) ein. |
${member.value} | Fügt den Wert für das erste Member ein. |
${otherMembers} | Fügt die übrigen Member ein. Für jedes Member wird das Schablonenfragment zwischen der ersten und der letzten Variable ${member.*} ausgewertet und an das Ergebnis angehängt. Die Zeichen zwischen dem letzten ${member.*} und ${otherMembers} definieren, welches Trennzeichen zwischen den Membern eingefügt wird (${otherMembers} muss nach der letzten Variablen ${member.*} stehen). |
Damit die Schablone korrekt funktioniert, darf die Variable ${otherMembers} genau ein Mal in einer Schablone verwendet werden. Außerdem darf ihr keine Variable ${member.*} folgen. Variablen des Typs ${object.*} können an einer beliebigen Position in der Schablone stehen; wird jedoch eine solche Variable in ein memberbezogenes Fragment gesetzt (also zwischen die erste Variable ${member.*} und ${otherMembers}), so wird sie für jedes Member wiederholt, was wahrscheinlich keine sinnvolle Lösung ist.
Die obige Beschreibung mag kompliziert erscheinen, doch das Schablonenformat an sich ist einfach zu verwenden. Einige betriebsfähige Anschauungsbeispiele dienen der Verdeutlichung.
Die Standardschablone liefert ein gutes Beispiel:
${class.name} [${member.name()}=${member.value}, ${otherMembers}]
Die Ausgabezeichenfolge für diese Schablone sieht folgendermaßen aus:
FooClass[aFloat=1.0, aString=hello, anInt=10, anObject=null, aCharMethod()=a]
Es ist auch eine mehrzeilige Ausgabe verfügbar:
${object.getClassName} { ${member.name}: ${member.value} ${otherMembers} }
Beispielergebnis:
FooClass { aFloat: 1.0 aString: hello anInt: 10 anObject: null aCharMethod: a }
Wenn Sie ein Member in geschweifte Klammern setzen, dürfen Sie nicht vergessen, die Variable ${otherMembers} ebenfalls in geschweifte Klammern zu setzen:
{${member.name}=${member.value}}, {${otherMembers}}
Die Wirkung ist folgende:
{aFloat=1.0}, {aString=hello}, {anInt=10}, {anObject=null}, {aCharMethod=a}
${object.*}-Variablen können am Anfang und am Ende der Schablonen verwendet werden:
${object.getClassName} (hashcode:${object.hashCode}) members: ${member.name} = ${member.value}; ${otherMembers} [super: ${object.superToString}]
Diese Schablone würde eine Ausgabe zur Folge haben, die in etwa wie die folgende aussähe:
FooClass (hashCode:232198409832) members: aFloat = 1.0; aString = hello; anInt = 10; anObject = null; aCharMethod = a [super: SuperFooClass[aField=null]]
Dialog 'toString() generieren'
toString()-Generator: Codedarstellungen
toString()-Generator: Inhaltsauflistung