Zusammenfassung des ToString-Verhaltens mit Java- und Groovy-Annotationen

das ist?

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.

1 Keine Anmerkung

Wer will das sehen

public class FooId1 {
    private final String value = "1234";
}
// to_string.j.c.FooId1@27c170f0

2 Einfach anbringen

Es ist einfach und je nach Situation reicht dies aus

@lombok.ToString
public class FooId2 {
    private final String value = "1234";
}
// FooId2(value=1234))

3 Beseitigen Sie Feldnamen

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)

4 Wird verwendet, wenn ein Accessor vorhanden ist

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)

5 Verwenden Sie keine Accessoren

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)

2'2 Beispielverschachtelung

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))

3'3 Beispielverschachtelung

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

1 Keine Anmerkung

Dies ist in Ordnung für "Enum"

public enum FooStatus1 {
    APPLYING, NOT_APPLYING
}
// NOT_APPLYING

2 Einfach anbringen

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.

1 Keine Anmerkung

Ebenso besteht hierfür keine Nachfrage

class FooId1 {
    private final String value = '1234'
}
// to_string.g.c.FooId1@3159c4b8

2 Einfach anbringen

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()

3 Versuchen Sie, es öffentlich zu machen

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()

4 Entfernen Sie den Zugriffsmodifikator

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)

Schließen Sie explizit 5 Felder ein

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)

6 Einschließlich Feldname

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)

7 Schließen Sie kein FQCN ein

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)

Verschachtelung von 6'6 Beispielen

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))

Verschachtelung von 7'7 Beispielen

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"

1 Keine Anmerkung

Dies ist in Ordnung für "Enum"

public enum FooStatus1 {
    APPLYING, NOT_APPLYING
}
// NOT_APPLYING

2 Einfach anbringen

Es ist schön, dass der Klassenname erscheint, aber der wichtige Teil ist nicht enthalten

@lombok.ToString
public enum FooStatus2 {
    APPLYING, NOT_APPLYING
}
// FooStatus2()

Zusammenfassung

Korrespondenztabelle

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

Java-Repost

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

Groovy neu gepostet

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!

Bonus

Verwenden Sie @ lombok.ToString für Groovy Class

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

Verwenden Sie @ groovy.transform.ToString für Java Class

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

So geben Sie ein Array von Java-Anmerkungen an

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)

So geben Sie ein Array von Groovy-Anmerkungen an

Ich 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?

Grooviges privates Feld

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

スクリーンショット 2017-07-01 21.25.57.png

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

スクリーンショット 2017-07-01 21.24.23.png スクリーンショット 2017-07-01 21.25.21.png

v3 und v6 erscheinen nicht als Abschlusskandidaten, und selbst wenn Sie schreiben, sind v3 und v6 ein wenig gelb! Vielen Dank, IntelliJ!

Referenz

Eigentlich unzufrieden mit dem Ergebnis von Enum

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.

MetaClass ist gemischt

Ü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

Zusammenfassung des ToString-Verhaltens mit Java- und Groovy-Annotationen
Zusammenfassung von Java Math.random und Import (Kalender)
[Java] Persönliche Zusammenfassung der Klassen und Methoden (grundlegend)
Zusammenfassung der Java-Unterstützung 2018
Überprüfen Sie das Verhalten von Java Intrinsic Locks mit bpftrace
Zusammenfassung von FileInputStream und BufferedInputStream
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Zusammenfassung der Operatoren (Operator)
Zusammenfassung der Grundlagen der Java-Sprache
Zusammenfassung der Java Math Klasse
Vor- und Nachteile von Java
[Java] Zusammenfassung der Steuerungssyntax
Zusammenfassung der Java-Fehlerverarbeitung
[Java] Zusammenfassung der Entwurfsmuster
[Java] Zusammenfassung der mathematischen Operationen
Ich habe das Verhalten von Java Scanner und .nextLine () nicht wirklich verstanden.
Fensteraggregation von Sensordaten mit Apache Flink und Java 8
Java-Anfänger fassten das Verhalten von Array und ArrayList kurz zusammen
Verwenden Sie Java mit MSYS und Cygwin
Verteilte Ablaufverfolgung mit OpenCensus und Java
[Für Anfänger] Zusammenfassung des Java-Konstruktors
Installieren Sie Java und Tomcat mit Ansible
Java-Veröffentlichungsdatum und EOL-Zusammenfassung
Über Biocontainer fastqc und Java
Zusammenfassung des Pakets [Java Silver Study]
Verwenden Sie JDBC mit Java und Scala.
Vergleiche Hallo Welt! Mit Spring Boot mit Java, Kotlin und Groovy
PDF und TIFF mit Java 8 ausgeben
Zusammenfassung der objektorientierten Programmierung mit Java
Mit Java verschlüsseln und mit C # entschlüsseln
Zusammenfassung der Probleme und Gegenmaßnahmen beim Betrieb des IE mit WebDriver of Selenium2
[Code Pipeline x Elastic Beanstalk] Zusammenfassung der Fehler und Gegenmaßnahmen für CI / CD-Java-Anwendungen zu Elastic Beanstalk mit Code Pipeline
Ich möchte Bilder mit REST Controller von Java und Spring anzeigen!
Eine kurze Zusammenfassung der DI- und DI-Container
[Java Silver] Zusammenfassung der Zugriffsmodifikatorpunkte
Zusammenfassung der internen Rookie-Lernsitzung [Java]
Überwachen Sie Java-Anwendungen mit Jolokia und Hawtio
Nach 3 Monaten Java- und Frühlingstraining
Verknüpfen Sie Java- und C ++ - Code mit SWIG
[java] Zusammenfassung des Umgangs mit char
Zusammenfassung anderer Änderungen als JEP von Java10
Probieren wir WebSocket mit Java und Javascript aus!
[Java] Persönliche Zusammenfassung der bedingten Anweisungen (grundlegend)
[Java] Lesen und Schreiben von Dateien mit OpenCSV
Zusammenfassung der Hashes und Symbole in Ruby
[Java / Swift] Vergleich von Java-Schnittstelle und Swift-Protokoll
[Java] [Maven3] Zusammenfassung der Verwendung von Maven3
Java Zusammenfassung der häufig gesuchten Typkonvertierungen
[Java] [Spring] Testen Sie das Verhalten des Loggers
[Java] Inhalt der Collection-Schnittstelle und der List-Schnittstelle
Diskriminierung von Enum in Java 7 und höher
Zusammenfassung der Umgebungskonstruktion mit rvm und postgresql
Zusammenfassung der guten Punkte und Vorsichtsmaßnahmen bei der Konvertierung der Java Android-Anwendung in Kotlin
Zusammenfassung der gegenseitigen Konvertierung zwischen Groovys Standard-Groovy-Methoden und Javas Stream-API
Effektive Java 3rd Edition Kapitel 6 Aufzählung und Anmerkungen