プログラマー向け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 ...; } 

@EqualsAndHashCodeEqualsおよび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() { ... } 


@Builderbulderパターンの実装、
単数形 -のオブジェクトに使用
シングルコピー(アイテムを追加
コレクション内など)
 @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(); } } 

Source: https://habr.com/ru/post/J345520/


All Articles