[JAVA] Versuchen Sie es mit Lombok

Das ist jetzt auch super. Die Lesung ist "Ronboku".

Vorbereitung

Es war am einfachsten, es in Maven zu platzieren. Kurz gesagt, alles ist in Ordnung, solange Sie den Klassenpfad zu lombok.jar übergeben.

pom.xml


<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.16</version>
    <scope>compile</scope>
</dependency>

Automatische Erzeugung von Getter / Setter

↓ Das ist

Product.java(@Vor der Einführung von Daten)


public class Product implements Serializable {
    private String code;
    private String name;
    private BigDecimal price;

    /*Durcheinander gebracht*/
    public Product() {}
    public String getCode() { return this.code; }
    public String getName() { return this.name; }
    public BigDecimal getPrice() { return this.price; }
    public void setCode(String code) { this.code = code; }
    public void setName(String name) { this.name = name; }
    public void setPrice(BigDecimal price) { this.price = price; }
}

↓ Es wird so sein.

Product.java(@Nach der Einführung von Daten)


@Data
public class Product implements Serializable {
    private String code;
    private String name;
    private BigDecimal price;

    /*Erfrischend!*/
}

Der Anrufer kann es normal anrufen, vorausgesetzt, es gibt einen Getter / Setter.

python


Product product = new Product();
product.setCode("0001");
product.setName("Produkt 01");
product.setPrice(BigDecimal.valueOf(10000L));

product.getCode();  // => 0001
product.getName();  // =>Produkt 01
product.getPrice(); // => 10,000

Ich hoffe, dass sich die Lesbarkeit verbessert.

Automatische Generierung von Builder-Mustern

Durch Hinzufügen der oben erwähnten Annotation "@ Builder" zu Product.java kann der Aufrufer auch Folgendes tun.

python


Product product = Product.builder()
        .code("0001")
        .name("Produkt 01")
        .price(BigDecimal.valueOf(10000L))
        .build();

Irgendwie modern und cool.

Ist es übrigens in Ordnung zu glauben, dass JavaBeans- und Builder-Muster konsistent sind? (In der Java Beans-Spezifikation heißt es: "Haben Sie einen Getter / Setter" (* Ich sage nicht, dass ich keine andere Methode als Getter / Setter habe))

Behandeln Sie geprüfte Ausnahmen wie ungeprüfte Ausnahmen

Sie erhalten keinen Kompilierungsfehler, auch wenn Sie die aktivierte Ausnahme beim Aufrufer nicht abfangen. Das heißt, ↓ das ist

@Vor der Einführung von Sneaky Throws


private String encrypt(String src) {
    MessageDigest md;
    try {
        md = MessageDigest.getInstance("SHA-256");
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }

    md.update(src.getBytes());
    return md.digest();
}

↓ Es wird so sein.

@Nach der Einführung von Sneaky Throws


@SneakyThrows
private String encrypt(String src) {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(src.getBytes());
    return md.digest();
}

Ich habe es jedoch nicht im Detail untersucht, aber ich denke, es ist besser, es nicht zu verwenden. Ich verstehe das Prinzip nicht, aber es ist nicht so, als würde man die geprüfte Ausnahme in "RuntimeException" einschließen. Es wird nur der Compiler ausgetrickst, um zu verhindern, dass die geprüfte Ausnahme zu einem Kompilierungsfehler wird. Wenn Sie in der obigen Quelle absichtlich eine "NoSuchAlgorithmException" auslösen, wird diese direkt an den Anrufer weitergeleitet. Dies kann unerwartete Nebenwirkungen haben. Es wäre schön, wenn wir wüssten, dass keine Ausnahme wie bei der obigen Quelle auftreten würde (SHA-256 ist immer enthalten).

Im Einzelnen war die Abdeckung von Jacoco (0,8,2) mit der Annotation SneakyThrows nicht 100%. Wenn Sie in Ihrem Testplan 100% Deckung angeben, kann dies später problematisch sein.

Beiseite

Es ist in Ordnung, dass Getter / Setter automatisch generiert werden können, aber ich stehe vor einem wesentlichen Widerspruch, dass der JavaBeans-Setter selbst möglicherweise überhaupt gegen die Idee der Kapselung ist. Ich bin nicht sicher, ob ich eine zufriedenstellende Antwort geben kann, wenn ich gefragt werde: "Geht es nicht nur darum, das Feld ohne den Getter / Setter öffentlich zu machen?"

Recommended Posts

Versuchen Sie es mit Lombok
Lombok ① Einführung
Probieren Sie HiveRunner aus
Lombok Memo
Versuchen Sie es mit Mockito
Versuchen Sie es mit Selen
Versuchen Sie es mit DbUnit
Versuchen Sie es mit libGDX
Versuchen Sie zuerst ~ catch
Versuchen Sie es mit Maven
Versuchen Sie es mit powermock-mockito2-2.0.2
Versuchen Sie es mit GraalVM
Probieren Sie Java 8 Stream aus
Versuchen Sie es mit jmockit 1.48
Versuchen Sie es mit SwiftLint
Versuchen Sie es mit Log4j 2.0
Versuchen Sie Ruby Minitest
Versuchen Sie es mit Java 9
Hinweise zur Überprüfung bei der Verwendung von Lombok