Die Arbeit ist "src.main" ist "Java", "src.test" ist "Groovy", aber wenn ich "src.main" in "Groovy" mit einer etwas anderen Anforderung geschrieben habe, habe ich mich in "@ ToString" verliebt, also habe ich es zusammengefasst Memo Ich weiß nicht, wie aussagekräftig die Zusammenfassung ist
Es ist ein System, das eine Klasse mit "Groovy" erstellt, ausführt und verwendet, während Variablen mit "AOP" an das Terminal und die Protokolldatei ausgegeben werden, aber es war überhaupt nicht richtig "ToString", also habe ich es überprüft.
Java
Java
hat eine Anmerkung @ lombok.ToString
(erfordert lombok
)
lombok.ToString
public @interface ToString {
boolean includeFieldNames() default true;
String[] exclude() default {};
String[] of() default {};
boolean callSuper() default false;
boolean doNotUseGetters() default false;
}
Es ist ein Auszug, der den "Javadoc" -Teil der Quelle ausschließt, aber der Hauptpunkt sind die obigen Einstellungselemente
Class Normalerweise wird es als "Import" verwendet, aber dieses Mal möchte ich es angeben und wie "@ lombok.ToString" schreiben, um die Anzahl der geposteten Codezeilen zu reduzieren.
Wer will das sehen
public class FooId1 {
private final String value = "1234";
}
// to_string.j.c.FooId1@27c170f0
Es ist einfach und je nach Situation reicht dies aus
@lombok.ToString
public class FooId2 {
private final String value = "1234";
}
// FooId2(value=1234))
Ich werde Ihnen später ein Beispiel geben, aber dies ist besser, wenn Sie eine Klassenstruktur mit vielen Nestern haben.
@lombok.ToString(includeFieldNames = false)
public class FooId3 {
private final String value = "1234";
}
// FooId3(1234)
Es ist unwahrscheinlich, dass Sie einen seltsamen Accessor von Hand schreiben, aber es scheint ein Unfall zu sein und als kleine Geschichte veröffentlicht zu werden
@lombok.ToString
public class FooId4 {
private final String value = "1234";
public String getValue() {
return "5678";
}
}
// FooId4(value=5678)
Wenn Sie so schreiben, können Sie Unfälle vermeiden
@lombok.ToString(doNotUseGetters = true)
public class FooId5 {
private final String value = "1234";
public String getValue() {
return "5678";
}
}
// FooId5(value=1234)
Wenn Sie es nur anhängen, ist es persönlich überflüssig
@lombok.ToString
public class Foo2 {
private final FooId2 id = new FooId2();
private final FooName2 name = new FooName2();
}
// Foo2(id=FooId2(value=1234), name=FooName2(value=John Doe))
Dies ist persönlich das Beste für die Java-Klasse
@lombok.ToString(includeFieldNames = false)
public class Foo3 {
private final FooId3 id = new FooId3();
private final FooName3 name = new FooName3();
}
// Foo3(FooId3(1234), FooName3(John Doe))
Enum Ich habe auch "Enum" überprüft
Dies ist in Ordnung für "Enum"
public enum FooStatus1 {
APPLYING, NOT_APPLYING
}
// NOT_APPLYING
Es ist schön, dass der Klassenname erscheint, aber der wichtige Teil ist nicht enthalten
@lombok.ToString
public enum FooStatus2 {
APPLYING, NOT_APPLYING
}
// FooStatus2()
Groovy
Groovy
hat eine Anmerkung @ groovy.transform.ToString
, die von der Sprache bereitgestellt wird
lombok.ToString
public @interface ToString {
String[] excludes() default {};
String[] includes() default {};
boolean includeSuper() default false;
boolean includeSuperProperties() default false;
boolean includeNames() default false;
boolean includeFields() default false;
boolean ignoreNulls() default false;
boolean includePackage() default true;
boolean cache() default false;
}
Ebenso werden nur die Einstellungselemente extrahiert
Class
Ich habe Groovy
erst verstanden, als ich verschiedene Dinge ausprobiert habe.
Ebenso besteht hierfür keine Nachfrage
class FooId1 {
private final String value = '1234'
}
// to_string.g.c.FooId1@3159c4b8
Es ist nicht preislich! ?? Es hat sich praktisch nichts geändert, oder? ??
@groovy.transform.ToString
class FooId2 {
private final String value = '1234'
}
// to_string.g.c.FooId2()
Ich dachte, dass "privat" schlecht ist, also habe ich versucht, es "öffentlich" zu machen, aber es hat sich nicht gelöst
@groovy.transform.ToString
class FooId3 {
public final String value = '1234'
}
// to_string.g.c.FooId3()
Aus irgendeinem Grund gelöst Aber ich möchte es "privat" machen
@groovy.transform.ToString
class FooId4 {
final String value = '1234'
}
// to_string.g.c.FooId4(1234)
Es scheint, dass das Feld nicht standardmäßig enthalten ist, wenn verschiedene Dinge betrachtet werden
@groovy.transform.ToString(includeFields = true)
class FooId5 {
private final String value = '1234'
}
// to_string.g.c.FooId5(1234)
Kann auch enthalten sein
@groovy.transform.ToString(includeFields = true, includeNames = true)
class FooId6 {
private final String value = '1234'
}
// to_string.g.c.FooId6(value:1234)
Wenn Sie über die Paketkonfiguration in einem bestimmten Maßstab richtig nachdenken, wird es zu lang sein, wenn FQCN vorhanden ist, daher möchte ich es löschen
@groovy.transform.ToString(includeFields = true, includePackage = false)
class FooId7 {
private final String value = '1234'
}
// FooId7(1234)
Ist es zu lang, um "FQCN" und den Feldnamen zu haben?
@groovy.transform.ToString(includeFields = true, includeNames = true)
class Foo6 {
private final FooId6 id = new FooId6()
private final FooName6 name = new FooName6()
}
// to_string.g.c.Foo6(id:to_string.g.c.FooId6(value:1234), name:to_string.g.c.FooName6(value:Jane Doe))
Für die "Groovy" -Klasse ist dies persönlich das Beste
@groovy.transform.ToString(includeFields = true, includePackage = false)
class Foo7 {
private final FooId7 id = new FooId7()
private final FooName7 name = new FooName7()
}
// Foo7(FooId7(1234), FooName7(Jane Doe))
Enum Genau das gleiche wie "Java" für "Enum"
Dies ist in Ordnung für "Enum"
public enum FooStatus1 {
APPLYING, NOT_APPLYING
}
// NOT_APPLYING
Es ist schön, dass der Klassenname erscheint, aber der wichtige Teil ist nicht enthalten
@lombok.ToString
public enum FooStatus2 {
APPLYING, NOT_APPLYING
}
// FooStatus2()
Organisieren Sie nur die Teile, die wahrscheinlich übereinstimmen
Artikel | Java | Groovy | Bemerkungen |
---|---|---|---|
Feldname | includeFieldNames() default true |
includeNames() default false |
Das Gegenteil |
Enthält einige Felder | of() default {} |
includes() default {} |
Ich habe nicht vor, diesen Artikel anzugeben Das Beispiel wird weggelassen |
Einige Felder ausschließen | exclude() default {} |
excludes() default {} |
Das gleiche wie oben |
Verhalten zum Zeitpunkt der Vererbung | callSuper() default false |
includeSuper() default false |
Da es nicht erbt, wird das Beispiel weggelassen. |
FQCN | Erscheint nicht | includePackage() default true |
In gewissem Sinne das Gegenteil |
Es gibt noch ein Element in "@ groovy.transform.ToString", aber es gibt kein entsprechendes Element in "@ lombok.ToString" und ich bin jetzt nicht daran interessiert, daher werde ich es weglassen
Class
ist die gleiche Spezifikationsmethode wie Foo
, Enum
wird ohne Annotation vereinheitlicht
@lombok.ToString(includeFieldNames = false)
public class Foo {
private final FooId id = new FooId();
private final FooName name = new FooName();
private final FooStatus fooStatus = FooStatus.NOT_APPLYING;
private final BarStatus barStatus = BarStatus.NOT_APPLYING;
}
// Foo(FooId(1234), FooName(John Doe), NOT_APPLYING, NOT_APPLYING)
Ich denke, dass nur die erfrischendsten und wichtigsten Punkte angezeigt werden
In ähnlicher Weise wird "Klasse" auf die gleiche Weise wie "Foo" angegeben, und "Enum" wird ohne Anmerkungen vereinheitlicht.
@groovy.transform.ToString(includeFields = true, includePackage = false)
class Foo {
private final FooId id = new FooId()
private final FooName name = new FooName()
private final FooStatus fooStatus = FooStatus.NOT_APPLYING
private final BarStatus barStatus = BarStatus.NOT_APPLYING
}
// Foo(FooId(1234), FooName(Jane Doe), NOT_APPLYING, NOT_APPLYING)
Es war genau das gleiche!
Normalerweise mache ich eine Klasse mit "Java", aber wenn ich eine Klasse mit "Groovy" mache und nur den Annotationsteil von "Java" kopiere, wird es gemischt.
Es ist aus der Schlussfolgerung bedeutungslos
@lombok.ToString
class FooId1 {
private final String value = '1234'
}
// to_string.r.g.FooId1@29ca901e
Ich glaube nicht, dass das Gegenteil passieren kann, aber ich habe es versucht
Immerhin ist es aus der Schlussfolgerung bedeutungslos
@groovy.transform.ToString
public class FooId1 {
private final String value = "1234";
}
// to_string.r.j.FooId1@27c170f0
Geht es hier mehr um Anmerkungen im Allgemeinen als um "@ ToString"?
Geben Sie für "Java" "{x, y, ...}" an ich weiß das
@lombok.ToString(includeFieldNames = false, of = {"spam", "egg"})
public class Python {
private final String spam = "spam";
private final String ham = "ham";
private final String egg = "egg";
}
// Python(spam, egg)
{" Spam "}
kann als " Spam "
geschrieben werdenIch habe das zuerst nicht verstanden und es war sehr verwirrend aufgrund des Verhaltens des Zugriffsmodifikators von groovy.transform.ToString
.
Geben Sie für "Groovy" "[x, y, ...]" an
@groovy.transform.ToString(includePackage = false, includes = ['spam', 'egg'])
class Python {
private final String spam = 'spam'
private final String ham = 'ham'
private final String egg = 'egg'
}
// Python()
...!? Ich wurde vor nichts gewarnt, aber es fühlt sich völlig nutzlos an, aber was ist das?
Ich war wirklich begeistert, aber wenn ich jetzt darüber nachdenke, gibt es kein "includeFields = true". Ich bin ein bisschen lustig, weil ich genau das zusammengestellt habe, damit ich es sofort verstehen kann
Ist es nicht sinnvoll, "Includes" anzugeben, ohne "IncludeFields" zu setzen? !! Verwirrend! !! !!
Übrigens scheint die mysteriöse Notation wie "enthält =" Spam, Ei "eine Ameise zu sein.
Ist dies die Regel von "@ groovy.transform.ToString"? Groovy
Regeln?
Eigentlich ist "privat" von "Groovy" fast bedeutungslos Selbst wenn Sie "private" entfernen und einfach "@ groovy.transform.ToString" hinzufügen, ist dies tatsächlich in Ordnung.
Lassen Sie uns für einen Moment von "@ groovy.transform.ToString" weggehen und das Verhalten von "privat" organisieren
class Bar {
String v1 = 'v1'
public String v2 = 'v2'
private String v3 = 'v3'
static String v4 = 'v4'
static public String v5 = 'v5'
static private String v6 = 'v6'
}
Schreiben Sie eine Klasse wie diese
Wenn Sie so schreiben, können Sie darauf zugreifen
Wenn es sich jedoch um "IntelliJ" handelt, wird es nicht ergänzt und eine Warnung wird ausgegeben, selbst wenn Sie es erzwingen. Daher möchte ich es vorerst als "privat" schreiben
v3
und v6
erscheinen nicht als Abschlusskandidaten, und selbst wenn Sie schreiben, sind v3
und v6
ein wenig gelb!
Vielen Dank, IntelliJ!
Wie ich in der Zusammenfassung erneut gepostet habe, wird es ein wenig schwierig zu verstehen, ob "Enum" mit demselben Elementnamen in einer Reihe stehen.
// Foo(FooId(1234), FooName(John Doe), NOT_APPLYING, NOT_APPLYING)
Wenn Sie sich mit "ANWENDEN, NICHT ANWENDEN, ANWENDEN" anstellen, erhalten Sie möglicherweise "Hmm? Was ist der zweite?"
Das Ideal ist also, wie unten auszusehen, aber es hat nicht geklappt
// Foo(FooId(1234), FooName(John Doe), FooStatus.NOT_APPLYING, BarStatus.NOT_APPLYING)
Ich kann es tun, wenn ich so schreibe Ich möchte nicht handschriftlich schreiben
public enum BazStatus {
APPLYING, NOT_APPLYING;
@Override
public String toString() {
return getClass().getSimpleName() + "." + name();
}
}
// BazStatus.NOT_APPLYING
Ich habe viele kleine Beschwerden außer "@ ToString", daher möchte ich eine Anmerkung machen, aber wie mache ich eine Anmerkung für ein System, das solchen Code erzeugt? Abhängig vom Inhalt benötigen Sie auch das InelliJ-Plug-In, und es ist immer noch schwierig für mich, es als Team bei der Arbeit zu verwenden.
Übrigens habe ich vergessen, weil ich es in dieser Zusammenfassung nicht gesehen habe, aber als ich mich während der Arbeit damit beschäftigte, wurde so etwas im Ergebnis von "@ groovy.transform.ToString" gemischt. Es war jedoch ein Hindernis, weil es nur ein Hash mit "FQCN" war und es nutzlos lang war und ich mich nicht für den Inhalt interessierte, weil ich ihn nicht selbst eingestellt hatte.
Ich frage mich also, ob ich über "Includes" recherchiert habe Ich war verwirrt, weil ich beim gleichzeitigen Kombinieren von Zugriffsmodifikatoren, includeFields, Includes und Array-Spezifikationen überprüft habe.
Das Ende
Recommended Posts