プログラマー向けJavaチートシート10:Lombok

画像



Lombokは、Javaのコンパイル前にソースコードを変更することにより、Javaに機能を追加するプロジェクトです。



実際、Lombokプロジェクトでは、ほとんどの場合Javaの冗長性を取り除き、ゲッター、セッター、イコール、ハッシュコード、およびtoString(はい、通常IDEによって生成されますが、プログラマーは読み取りと変更が必要です)からの大量のコードの書き込みを停止できます。 Kotlin、Scala、またはC#とほぼ同じくらい簡潔です。



Lombokは非常にシンプルで、プロジェクトに簡単に追加できます。 私のように、KISSの原則が好きなら、ロンボクをご覧になることをお勧めします。



また、最新のJava SE8チートシートなど、シリーズの他の記事も参照することをお勧めします。



プロジェクトへの追加は非常に簡単で、通常の依存関係を追加するだけです。



詳細
メイヴン



<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency>
      
      





可能です(ただし、Lombokのコンパイル後にコードを分析する必要がある場合は、静的コンパイラーの操作用のプラグインを追加する必要はありません)、 こちらを参照してください



グラドル



 plugins { id 'net.ltgt.apt' version '0.10' } dependencies { compileOnly 'org.projectlombok:lombok:1.16.18' apt "org.projectlombok:lombok:1.16.18" }
      
      





IdeaEclipseなどのプラグインもあります。 GradleまたはMavenをビルドすると、これらのプラグインなしでビルドされますが、Idea / Eclipseはコードを分析するときにおそらくエラーを表示します。



コマンドと注釈:

テーブル
役職 説明 ロンボクの例

プレーンJavaの例

@NonNull



可変処理

nullを受け取るべきではない
 public Example(@NonNull P p) { super("Hello"); this.name = p.getName(); }
      
      





 public Example(@NonNull P p) { super("Hello"); if (p == null) { throw new NullPointerException("p"); } this.name = p.getName(); }
      
      





@Getter /

@Setter




ゲッターの簡単な作成と

セッター
 @Getter @Setter private int age = 10;
      
      





 private int age = 10; public int getAge() { return age; } public void setAge(int age) { this.age = age; }
      
      





@ToString



クラスの前の注釈の定義、

標準のtoStringメソッドを実装する
 @ToString(exclude="f") public class Example
      
      





 public class Example { @Override public String toString() { return ...; }
      
      





@EqualsAndHashCode



EqualsおよびHashCodeメソッドの簡単な作成
 @EqualsAndHashCode( exclude={"id1", "id2"}) public class Example {
      
      





 public class Example { ... @Override public boolean equals(Object o) { ... } @Override public int hashCode() { ... }
      
      





@NoArgsConstructor,

@RequiredArgsConstructor,

@AllArgsConstructor




空のコンストラクターを作成する

すべての最終フィールドを含むコンストラクター、

または、可能なすべてのフィールドを含むコンストラクター
 @RequiredArgsConstructor( staticName = "of" ) @AllArgsConstructor( access = AccessLevel.PROTECTED ) public class E<T> {
      
      





 public class E<T> { private E(T description) { ... } public static <T>E<T> of( T description ) { return new E<T>(description); }
      
      





@Data



すべてのユーティリティメソッドの生成、

すぐに@ ToString、@ EqualsAndHashCodeを置き換え、

GetterSetter 、@RequiredArgsConstructor
 @Data public class Example { private final String name; private int age; }
      
      





たくさんのコード
 public class Example { private final String name; private int age; public Example( String name ) { this.name = name; } public String getName() { return this.name; } void setAge(int age) { this.age = age; } public int getAge() { return this.age; } @Override public String toString() { return ...; } @Override public boolean equals( Object o ) { .... } @Override public int hashCode() { ... }
      
      







@Value



不変クラスを作成する

データの類似物、ただし不変クラス用
 @Value public class Example { private final String name; private int age; }
      
      





たくさんのコード
 public class Example { private final String name; private final int age; public Example( String name, int age ) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } @Override public String toString() { return ...; } @Override public boolean equals( Object o ) { .... } @Override public int hashCode() { ... }
      
      







@Builder



bulderパターンの実装、

単数形 -のオブジェクトに使用

シングルコピー(アイテムを追加

コレクション内など)
 @Builder public class Example { private String name; private int age; @Singular private Set<String> occupations; }
      
      





多くのコード
 public class Example { private String name; private int age; private Set<String> occupations; Example( String name, int age, Set<String> occupations ) { this.name = name; this.age = age; this.occupations = occupations; } public static ExampleBuilder builder() { return new ExampleBuilder(); } public static class ExampleBuilder { private String name; private int age; private ArrayList<> occupations; ExampleBuilder() { } public ExampleBuilder name( String name ) { this.name = name; return this; } public ExampleBuilder age( int age ) { this.age = age; return this; } public ExampleBuilder occupation( String occupation ) { if (this.occupations == null) { this.occupations = new ArrayList<String>(); } this.occupations.add(occupation); return this; } ... public Example build() { Set<String> occupations = ...; return new Example(name, age, occupations); } @java.lang.Override public String toString() { ... } } }
      
      







@SneakyThrows



チェック済み例外のラッパー

@SneakyThrows(

UnsupportedEncodingException.class)

public String utf8ToString(byte [] bytes){

新しい文字列(バイト、「UTF-8」)を返します。

}

 public String utf8ToString(byte[] bytes) { try { return new String(bytes, "UTF-8"); } catch (UnsupportedEncodingException e) { throw Lombok.sneakyThrow(e); } }
      
      





@Synchronized



同期ブロックの簡単な作成
 private final Object readLock = new Object(); @Synchronized public static void hello() { ...; } @Synchronized public int answerToLife() { ... } @Synchronized("readLock") public void foo() { ... }
      
      





たくさんのコード
 private static final Object $LOCK = new Object[0]; private final Object $lock = new Object[0]; private final Object readLock = new Object(); public static void hello() { synchronized($LOCK) { ... } } public int answerToLife() { synchronized($lock) { ... } } public void foo() { synchronized(readLock) { ... } }
      
      







@Log



ログの初期化を追加する

ロガーのタイプを選択することもできます:@CommonsLog、

@ JBossLog、 Log 、@ Log4j、@ Log4j2、@ Slf4j、@ XSlf4j
 @Slf4j public class Example { public static void main(String... args) { log.error("error"); }
      
      





 public class Example { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class); public static void main(String... args) { log.error("error"); }
      
      





ヴァル 簡単な最終作成

型推論を持つ変数、

それは同じ値です

議論した
 val map = new HashMap<Integer, String>(); for (val entry : map.entrySet()) { ... }
      
      





 final HashMap<Integer, String> map = new HashMap<Integer, String>(); ... for (final Map.Entry<Integer, String> entry : map.entrySet()) { ... }
      
      





@Cleanup



リソースの簡単な定義

自動的に閉じるように

コードの終了後。

(使用する場合はあまり関係ありません

リソースで試してください)
 @Cleanup InputStream in = new FileInputStream(args[0]); @Cleanup OutputStream out = new FileOutputStream(args[1]); ...
      
      





 InputStream in = new FileInputStream(args[0]); try { OutputStream out = new FileOutputStream(args[1]); try { ... } finally { if (out != null) { out.close(); } } } finally { if (in != null) { in.close(); } }
      
      













テーブルの読み取りが不十分と思われる場合は、順番に
タイトル: @NonNull

説明:変数処理、

nullを受け取るべきではない

ロンボク島コード:

 public Example(@NonNull P p) { super("Hello"); this.name = p.getName(); }
      
      



通常のJavaコード:

 public Example(@NonNull P p) { super("Hello"); if (p == null) { throw new NullPointerException("p"); } this.name = p.getName(); }
      
      









タイトル: ゲッター /

セッター

説明:ゲッターの簡単な作成と

セッター

ロンボク島コード:

 @Getter @Setter private int age = 10;
      
      



通常のJavaコード:

 private int age = 10; public int getAge() { return age; } public void setAge(int age) { this.age = age; }
      
      









タイトル: @ToString

説明:クラスの前に注釈を定義し、

標準のtoStringメソッドを実装する

ロンボク島コード:

 @ToString(exclude="f") public class Example
      
      



通常のJavaコード:

 public class Example { @Override public String toString() { return ...; }
      
      









タイトル: @EqualsAndHashCode

説明: EqualsおよびHashCodeメソッドの簡単な作成

ロンボク島コード:

 @EqualsAndHashCode( exclude={"id1", "id2"}) public class Example {
      
      



通常のJavaコード:

 public class Example { ... @Override public boolean equals(Object o) { ... } @Override public int hashCode() { ... }
      
      









タイトル:

@NoArgsConstructor、

@RequiredArgsConstructor、

@AllArgsConstructor

説明:空のコンストラクターを作成し、

すべての最終フィールドを含むコンストラクター、

または、可能なすべてのフィールドを含むコンストラクター

ロンボク島コード:

 @RequiredArgsConstructor( staticName = "of" ) @AllArgsConstructor( access = AccessLevel.PROTECTED ) public class E<T> {
      
      



通常のJavaコード:

 public class E<T> { private E(T description) { ... } public static <T>E<T> of( T description ) { return new E<T>(description); }
      
      









タイトル: データ

説明:すべてのユーティリティメソッドの生成、

すぐに@ ToString、@ EqualsAndHashCodeを置き換え、

GetterSetter 、@RequiredArgsConstructor

ロンボク島コード:

 @Data public class Example { private final String name; private int age; }
      
      









 public class Example { private final String name; private int age; public Example( String name ) { this.name = name; } public String getName() { return this.name; } void setAge(int age) { this.age = age; } public int getAge() { return this.age; } @Override public String toString() { return ...; } @Override public boolean equals( Object o ) { .... } @Override public int hashCode() { ... }
      
      











タイトル:

説明:不変クラスの作成、

データの類似物、ただし不変クラス用

ロンボク島コード:

 @Value public class Example { private final String name; private int age; }
      
      







通常のJavaコード:

 public class Example { private final String name; private final int age; public Example( String name, int age ) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } @Override public String toString() { return ...; } @Override public boolean equals( Object o ) { .... } @Override public int hashCode() { ... }
      
      











タイトル: ビルダー

説明: bulderパターンの実装、

単数形 -のオブジェクトに使用

シングルコピー(アイテムを追加

コレクション内など)

ロンボク島コード:

 @Builder public class Example { private String name; private int age; @Singular private Set<String> occupations; }
      
      







通常のJavaコード:

 public class Example { private String name; private int age; private Set<String> occupations; Example( String name, int age, Set<String> occupations ) { this.name = name; this.age = age; this.occupations = occupations; } public static ExampleBuilder builder() { return new ExampleBuilder(); } public static class ExampleBuilder { private String name; private int age; private ArrayList<> occupations; ExampleBuilder() { } public ExampleBuilder name( String name ) { this.name = name; return this; } public ExampleBuilder age( int age ) { this.age = age; return this; } public ExampleBuilder occupation( String occupation ) { if (this.occupations == null) { this.occupations = new ArrayList<String>(); } this.occupations.add(occupation); return this; } ... public Example build() { Set<String> occupations = ...; return new Example(name, age, occupations); } @java.lang.Override public String toString() { ... } } }
      
      











タイトル: @SneakyThrows

説明:チェック済み例外のラッパー

ロンボク島コード:



@SneakyThrows(

UnsupportedEncodingException.class)

public String utf8ToString(byte [] bytes){

新しい文字列(バイト、「UTF-8」)を返します。

}



ロンボク島コード:

 public String utf8ToString(byte[] bytes) { try { return new String(bytes, "UTF-8"); } catch (UnsupportedEncodingException e) { throw Lombok.sneakyThrow(e); } }
      
      









タイトル: @Synchronized

説明:同期ブロックの簡単な作成

ロンボク島コード:

 private final Object readLock = new Object(); @Synchronized public static void hello() { ...; } @Synchronized public int answerToLife() { ... } @Synchronized("readLock") public void foo() { ... }
      
      







通常のJavaコード:

 private static final Object $LOCK = new Object[0]; private final Object $lock = new Object[0]; private final Object readLock = new Object(); public static void hello() { synchronized($LOCK) { ... } } public int answerToLife() { synchronized($lock) { ... } } public void foo() { synchronized(readLock) { ... } }
      
      











タイトル: ログ

説明:ログ初期化の追加、

ロガーのタイプを選択することもできます:@CommonsLog、

@ JBossLog、 Log 、@ Log4j、@ Log4j2、@ Slf4j、@ XSlf4j

ロンボク島コード:

 @Slf4j public class Example { public static void main(String... args) { log.error("error"); }
      
      



通常のJavaコード:

 public class Example { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class); public static void main(String... args) { log.error("error"); }
      
      









ヴァルシンプルクリエーションファイナル

型推論を持つ変数、

それは同じ値です

議論した
 val map = new HashMap<Integer, String>(); for (val entry : map.entrySet()) { ... }
      
      





 final HashMap<Integer, String> map = new HashMap<Integer, String>(); ... for (final Map.Entry<Integer, String> entry : map.entrySet()) { ... }
      
      









タイトル: @Cleanup

説明:単純なリソース定義、

自動的に閉じるように

コードの終了後。

(使用する場合はあまり関係ありません

リソースで試してください)

ロンボク島コード:

 @Cleanup InputStream in = new FileInputStream(args[0]); @Cleanup OutputStream out = new FileOutputStream(args[1]); ...
      
      



通常のJavaコード:

 InputStream in = new FileInputStream(args[0]); try { OutputStream out = new FileOutputStream(args[1]); try { ... } finally { if (out != null) { out.close(); } } } finally { if (in != null) { in.close(); } }
      
      








All Articles