SlideShare a Scribd company logo
第3回 ありえる社内勉強会
 「いわががのLombok」
お前だれよ?


    twitter: @kiris

    いわなが?いわがが?
Lombokって何?


    http://projectlombok.org   
                                   created by

    Javaの冗長性を排除する為                 
                                       Roel Spilker
    のライブラリ

    「赤唐辛子」の意味

    v0.10.4

    MIT license                    
                                       Reinier Zwitserloot
Javaの冗長性って?


        こういうのとか


    class Data {
      private int value;

        public int getValue() {
          return value;
        }
        public void setValue(int value) {
          this.value = value;
        }
    }
Javaの冗長性って?


     後、こういうのとか…

    InputStream in = new InputStream(args[0]);
    try {
      ...
    } finally {
      If (in != null) in.close();
    }
Javaの冗長性って?


     他にも、こういうのとか…

    Map<String, List<String>> map =
          new HashMap<String, List<String>>();

    ...

    for(Map.Entry<String, List<String>> entry : map) {
      ...
    }
Javaの冗長性って?


     ……


    class MyClass {
      private static Log log =
          LogFactory.getLog(MyClass.class);

     private final String name;

     public MyClass(String name) {
       if (name == null) {
         throw new NullPointerException();
       }
       this.name = name;
     }

     @Override public int toString() {
       return “MyClass(name=”+ this.name +“)”;
     }
Javaの冗長性って?

 




         こうならない為のLombok!
         続きはWebで!!
冗長の何がいけないの?


    生産性が下がる

    コード量が増えて読みづらくなる

    バグが入り込む可能性がある

    死にたくなる
Lombokの導入
Lombokを入手する


    Download lombok.jar
    
        http://projectlombok.org/download.html

    Maven or Ivy
    
        http://projectlombok.org/mavenrepo/index.html
Lombokを使う


    Javac
    
        Classpathに追加

    GWT
    
        java -javaagent:lombok.jar=ECJ

    Play Framework
    
        https://github.com/aaronfreeman/play-lombok#readme

    ECJ
    
        java -javaagent:lombok.jar=ECJ 
        -Xbootclasspath/p:lombok.jar -jar ecj.jar -cp lombok.jar
LombokをIDEでも使う


    Eclipse, NetBeans なんかに対応
    
        IDEA IntelliJはまだ未対応

    java -jar lombok.jar
Lombokを試してみる
@Data


    import lombok.Data
    public @Data class DataExample {
      private final String name;
      private int count;
      private List<Object> list;
    }


    @Dataの主な機能
     
         全てのフィールドのgetter / setter の生成
     
         toString, equals, hashCodeの生成
     
         finalフィールドを引数にしたコンストラクタの生成
結果の確認(delombok)


    変換後のコードを出力
    
        java -jar lombok.jar delombok -p ${src}

    ファイルとして保存
    
        java -jar lombok.jar delombok -d ${output} ${src}

    Ant
    
        <delombok verbose="true" encoding="UTF-8" to="$
        {output}" from="${src}" />

    Maven
    
        https://github.com/awhitford/lombok.maven
@Data(変換後)


public class DataExample {
  private final String name;
  private int count;
  private List<Object> list;

    public DataExample(String name) {
      this.name = name;
    }

    public String getName() { return name; }
    public int getCount() { return count; }
    public void setCount(int count) { this.count = count; }
    @Override public String toString() { ... }
    @Override public boolean equals(Object other) { ... }
    @Override public int hashCode() { … }
}
Eclipseからも即時反映


    その場でアウトラインや補完候補に表示されます
他の機能

   @Getter / @Setter
   @Getter(lazy=true)
   @ToString
   @EqualsAndHashCode
   @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
   @Data
   @Cleanup
   @Synchronized
   @SneakyThrows
   @Log
   val
   @Delegate
                                           http://projectlombok.org/features/index.html
@Getter / @Setter


    Getter / Setterの自動生成

    @Dataよりも優先


    public class GetterSetterExample {
      @Getter @Setter private String name;
      @Getter(AccessLevel.PROTECTED) private int age;
    }
@Getter / @Setter(変換後)


    Getter / Setterの自動生成

    @Dataよりも優先


    public class GetterSetterExample {
      private String name;
      private int age;

        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        protected int getAge() { return age; }
    }
@Getter(lazy=true)


    いわゆるメモ化

    サブルーチン(関数)呼び出しの結果を保持し、再利用するこ
    とで、そのサブルーチンの呼び出し毎の再計算を防ぐ
    public class GetterLazyExample {
      @Getter(lazy=true) private final double[] cached = expensive();

        private double[] expensive() { ... }
    }
@Getter(lazy=true)(変換後)


    いわゆるメモ化

    サブルーチン(関数)呼び出しの結果を保持し、再利用するこ
    とで、そのサブルーチンの呼び出し毎の再計算を防ぐ
    public class GetterLazyExample {
      public double[] getCached() { // 本当はthread-safe
        if (!this.$lombok$lazy1i) {
          this.$lombok$lazy1v = expensive();
          this.$lombok$lazy1i = true;
        }
        return this.$lombok$lazy1v;
      }

        private double[] expensive() { ... }
    }
@Cleanup


    リソースの片付けを自動で行なう
    public static void main(String[] args) throws IOException {
      @Cleanup InputStream in = new FileInputStream(args[0]);
      @Cleanup("release") MyResource resource = new MyResource();
      ...
    }
@Cleanup(変換後)


    リソースの片付けを自動で行なう
    public static void main(String[] args) throws IOException {
      InputStream in = new FileInputStream(args[0]);
      try {
        MyResource resource = new MyResource();
        try {
          ...
        } finally {
          if (resource != null) resource.release();
        }
      } finally {
        if (in != null) in.close();
      }
    }
@Synchronized


    this以外のロックオブジェクトで排他
    public class SynchronizedExample {
      private final Object readLock = new Object();

        @Synchronized private int foo() {
          return 1;
        }
        @Syncrhonized("readLock") private int bar() {
          return 2;
        }
    }
@Synchronized(変換後)


    this以外のロックオブジェクトで排他
    public class SynchronizedExample {
      private final Object $lock = new Object();
      private final Object readLock = new Object();

        private int foo() {
          synchronized($lock) { return 1; }
        }

        private int bar() {
          synchronized(readLock) { return 2; }
        }
    }
val


    ローカル変数の型宣言を省略
    public static void main(String[] args) {
      val map = new HashMap<String, List<String>>();
      ...
      for(val entry : map.entrySet()) {
        ...
      }
    }
val(変換後)


    ローカル変数の型宣言を省略
    public static void main(String[] args) {
     final Map<String, List<String>> map =
          new HashMap<String, List<String>>();

     ...

      for(final Map.Entry<String, List<String>> entry :
    map.entrySet()) {
        ...
      }
    }
etc

   @ToString
       toStringの生成
   @EqualsAndHashCode
       equalsとhachCodeの生成
   @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
       コンストラクタの生成
   @SneakyThrows
       チェック例外を非チェック例外のようにthrowする
   @Delegate
       移譲処理の生成
                              http://projectlombok.org/features/index.html
Lombokのメリット


    コードの冗長性の排除
    
        生産性が上がる
    
        コードの見通しを良くなる
    
        バグを埋め込む可能性を減らす
    
        心の平穏
Lombokのデメリット


    魔法に見える(not WYSIWYG)

    Lombokのバグに悩まされる可能性がある

    リファクタリング機能との衝突

    デバッグがややこしくなる
ここまでのまとめ


    LombokはJavaの冗長性を排除する

    Lombokの導入はとても簡単

    魔法には代償をともなう
Break time
Lombokの仕組み
ソースコード生成?バイトコード生成?


    いいえ、AST変換です



    JavaのASTを直接生成・変換してます
    
        ソースコード生成と違ってコードが膨れあがりません
    
        バイトコード生成と違って同じコンパイル単位のクラスか
        らも可視的です
Lombokが保持するAST


    JavacとECJの二つのASTを別々に保持

    AnnotationHandlerも各AST毎に実装する必要がある

    二つのASTを統合するためのプロジェクトも進行中
    
        https://github.com/rzwitserloot/lombok.ast
Lombokの処理の流れ
エントリーポイント


    lombok.javac.apt.Processor
    
        implements javax.annotation.processing.Processor

    lombok.eclipse.TransformEclipseAST
    
        EclipseのParserにパッチを当てて実行
        
            https://github.com/rzwitserloot/lombok.patcher
    
        OSGi ClassLoaderに注入されて実行される
AnnotationHandlerの読み込み



    プラグイン形式の読み込み

    @ProviderFor(JavacAnnotationHandler.class)
    
        used SPI(http://code.google.com/p/spi/)
        
            Service Provider Interfaceのwrapper
ASTの探索



    ASTをトラバースしてアノテーションを探索

    アノテーションが見付かったら、
    対応するAnnotationHandlerのhandleを実行する
    AnnotationVisitor
    
        Implements JavacASTVisitor
    
        独自のVisitorも定義可能
        
            @ProviderFor(JavacASTVisitor.class)
        
            HandleVal
ASTの変換



    各AnnotationHandlerや各ASTVisitorで

    変換にはJavacなどの非公開APIを直接使用
    
        com.sun.tools.javac.tree
    
        org.eclipse.jdt.internal
Lombokを拡張する
Lombokを拡張するには?


    Lombokは外からの拡張を意識して作っているわけではない

    Lombok本体を模範することで拡張することは出来る
@Perf


    メソッドの実行時間を出力
    public class PerfExample {
      @Perf
      void foo() {
        ...
      }
    }
@Perf(変換後)


    メソッドの実行時間を出力
    public class PerfExample {
      void foo() {
        long $start = System.nanoTime();
        try {
            …
        } finally {
          System.out.println(“PerfExample.foo = ”+
              System.nanoTime() - $start));
        }
      }
    }
プロジェクトの作り方


    prototype: https://github.com/alexruiz/dw-lombok
    
        プロジェクト名などを置換
    
        Ivyの設定を一部変更
        
            ECJのjarが取得出来なかった
        
            Lombokの最新(0.10.4)を使いたかった
アノテーションの定義


    トリガーとなるPerfアノテーションを作成する
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Perf {
    }
AnnotationHandlerの作成


    Javac用とECJ用の二つのAnnotationHandlerを作成する
    // for javac
    package localhost.javac.handlers;

    @ProviderFor(JavacAnnotationHandler.class)
    public class HandlePerf extends JavacAnnotationHandler<Perf> {
      @Override
      public void handle(AnnotationValues<Perf> annotation,
          JCAnnotation ast, JavacNode annotationNode) {
        ...
      }
    }
AST変換処理の実装


    愚直にASTを作るだけの簡単なお仕事
    TreeMaker maker = methodNode.getTreeMaker();

    // long $start = long t1 = System.nanoTime();
    Name startName = methodNode.toName("$start");
    JCExpression nanoTimeMethod =
        chainDotsString(methodNode, "System.nanoTime");
    JCExpression nanoTimeApply =
        maker.Apply(List.<JCExpression>nil(), nanoTimeMethod,
        List.<JCExpression>nil());

    JCVariableDecl startDef =
        setGeneratedBy(maker.VarDef(maker.Modifiers(0), startName,
        maker.TypeIdent(getCtcInt(TypeTags.class, "LONG")),
        nanoTimeApply), ast);
テスト


    本体が用意しているテスト・インフラがそのまま使える
    @RunWith(DirectoryRunner.class)
    public class TestWithEcj implements TestParams {
      @Override public Compiler getCompiler() { return ECJ; }
      @Override public boolean printErrors() { return true; }

        @Override public File getBeforeDirectory() {
          return new File("test/transform/resource/before");
        }
        @Override public File getAfterDirectory() {
          return new File("test/transform/resource/after-ecj");
        }
        ...
    }
拡張されたLombokの実行


    jar化してClasspathに追加すれば良い
    $ ant dist
    $ javac -cp “.:lib/build/lombok.jar:dist/lombok-perf.jar”
    Example.java
    $ java -cp “.”Example
感想


    変換処理はわりと愚直にAST作るだけの簡単なお仕事

    本体のコードこそが最高のサンプル
    
        https://github.com/rzwitserloot/lombok/tree/master/src/co
    
        https://github.com/rzwitserloot/lombok/tree/master/src/co
まとめ


    Lombokは皆さんのJava嫌いをちょっとだけ癒してくれます



    きっとScalaプログラマにもなれないJavaプログラマの皆さん

    Lombokを手にいれてみませんか?
第三回ありえる社内勉強会 「いわががのLombok」

More Related Content

What's hot

Iocコンテナについて
IocコンテナについてIocコンテナについて
Iocコンテナについて
Akio Terayama
 
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
NTT DATA Technology & Innovation
 
決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話
Ryosuke Uchitate
 
What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?
土岐 孝平
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回
Naoyuki Yamada
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
ke-m kamekoopa
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
Rui Watanabe
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
ichirin2501
 
SQLアンチパターン~スパゲッティクエリ
SQLアンチパターン~スパゲッティクエリSQLアンチパターン~スパゲッティクエリ
SQLアンチパターン~スパゲッティクエリ
Itabashi Masayuki
 
サーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話しサーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話し
Akira Nagata
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
Takanori Suzuki
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Google Cloud Platform - Japan
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
Samir Hammoudi
 

What's hot (20)

Iocコンテナについて
IocコンテナについてIocコンテナについて
Iocコンテナについて
 
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
Java 18で入ったJVM関連の(やや細かめな)改善(JJUGナイトセミナー「Java 18 リリース記念イベント」発表資料)
 
決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話
 
What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回ElasticSearch勉強会 第6回
ElasticSearch勉強会 第6回
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
 
SQLアンチパターン~スパゲッティクエリ
SQLアンチパターン~スパゲッティクエリSQLアンチパターン~スパゲッティクエリ
SQLアンチパターン~スパゲッティクエリ
 
サーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話しサーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話し
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
Google Cloud ベストプラクティス:Google BigQuery 編 - 02 : データ処理 / クエリ / データ抽出
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
 

Viewers also liked

Angular 2 Migration - JHipster Meetup 6
Angular 2 Migration - JHipster Meetup 6Angular 2 Migration - JHipster Meetup 6
Angular 2 Migration - JHipster Meetup 6
William Marques
 
地域の魅力を伝えるツアーガイドAI
地域の魅力を伝えるツアーガイドAI地域の魅力を伝えるツアーガイドAI
地域の魅力を伝えるツアーガイドAI
JubatusOfficial
 
Sencha TouchのMVCについて 〜スケールするアプリケーションを求めて〜
Sencha TouchのMVCについて 〜スケールするアプリケーションを求めて〜Sencha TouchのMVCについて 〜スケールするアプリケーションを求めて〜
Sencha TouchのMVCについて 〜スケールするアプリケーションを求めて〜yoshiaki iwanaga
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラスKota Mizushima
 
AngularJS Version 1.3
AngularJS  Version 1.3AngularJS  Version 1.3
AngularJS Version 1.3
Nir Noy
 
1.3 y 1.4 subject and predicate
1.3 y 1.4 subject and predicate1.3 y 1.4 subject and predicate
1.3 y 1.4 subject and predicatepaolyta28
 
Javaから始めるscalaっぽい書き方
Javaから始めるscalaっぽい書き方Javaから始めるscalaっぽい書き方
Javaから始めるscalaっぽい書き方
Kenji Doi
 
Angular 1.x reloaded: improve your app now! and get ready for 2.0
Angular 1.x reloaded:  improve your app now! and get ready for 2.0Angular 1.x reloaded:  improve your app now! and get ready for 2.0
Angular 1.x reloaded: improve your app now! and get ready for 2.0
Carlo Bonamico
 
Componentes en angularjs 1.5
Componentes en angularjs 1.5Componentes en angularjs 1.5
Componentes en angularjs 1.5
Hugo Biarge
 
さわってみようReact.js、AngularJS(1系、2系)
さわってみようReact.js、AngularJS(1系、2系)さわってみようReact.js、AngularJS(1系、2系)
さわってみようReact.js、AngularJS(1系、2系)
Kazuhiro Yoshimoto
 
Code migration from Angular 1.x to Angular 2.0
Code migration from Angular 1.x to Angular 2.0Code migration from Angular 1.x to Angular 2.0
Code migration from Angular 1.x to Angular 2.0
Ran Wahle
 
Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?
Maxime Bernard
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
Makoto Fukuhara
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
Scalaのオブジェクトの話
Scalaのオブジェクトの話Scalaのオブジェクトの話
Scalaのオブジェクトの話
Yasuyuki Maeda
 
Migrating an application from Angular 1 to Angular 2
Migrating an application from Angular 1 to Angular 2 Migrating an application from Angular 1 to Angular 2
Migrating an application from Angular 1 to Angular 2
Ross Dederer
 
AngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSAngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJS
Kenneth Ceyer
 
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
Shumpei Shiraishi
 
Introduction to Angular 2
Introduction to Angular 2Introduction to Angular 2
Introduction to Angular 2
Knoldus Inc.
 

Viewers also liked (19)

Angular 2 Migration - JHipster Meetup 6
Angular 2 Migration - JHipster Meetup 6Angular 2 Migration - JHipster Meetup 6
Angular 2 Migration - JHipster Meetup 6
 
地域の魅力を伝えるツアーガイドAI
地域の魅力を伝えるツアーガイドAI地域の魅力を伝えるツアーガイドAI
地域の魅力を伝えるツアーガイドAI
 
Sencha TouchのMVCについて 〜スケールするアプリケーションを求めて〜
Sencha TouchのMVCについて 〜スケールするアプリケーションを求めて〜Sencha TouchのMVCについて 〜スケールするアプリケーションを求めて〜
Sencha TouchのMVCについて 〜スケールするアプリケーションを求めて〜
 
こわくない型クラス
こわくない型クラスこわくない型クラス
こわくない型クラス
 
AngularJS Version 1.3
AngularJS  Version 1.3AngularJS  Version 1.3
AngularJS Version 1.3
 
1.3 y 1.4 subject and predicate
1.3 y 1.4 subject and predicate1.3 y 1.4 subject and predicate
1.3 y 1.4 subject and predicate
 
Javaから始めるscalaっぽい書き方
Javaから始めるscalaっぽい書き方Javaから始めるscalaっぽい書き方
Javaから始めるscalaっぽい書き方
 
Angular 1.x reloaded: improve your app now! and get ready for 2.0
Angular 1.x reloaded:  improve your app now! and get ready for 2.0Angular 1.x reloaded:  improve your app now! and get ready for 2.0
Angular 1.x reloaded: improve your app now! and get ready for 2.0
 
Componentes en angularjs 1.5
Componentes en angularjs 1.5Componentes en angularjs 1.5
Componentes en angularjs 1.5
 
さわってみようReact.js、AngularJS(1系、2系)
さわってみようReact.js、AngularJS(1系、2系)さわってみようReact.js、AngularJS(1系、2系)
さわってみようReact.js、AngularJS(1系、2系)
 
Code migration from Angular 1.x to Angular 2.0
Code migration from Angular 1.x to Angular 2.0Code migration from Angular 1.x to Angular 2.0
Code migration from Angular 1.x to Angular 2.0
 
Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?Comment réussir son projet en Angular 1.5 ?
Comment réussir son projet en Angular 1.5 ?
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Scalaのオブジェクトの話
Scalaのオブジェクトの話Scalaのオブジェクトの話
Scalaのオブジェクトの話
 
Migrating an application from Angular 1 to Angular 2
Migrating an application from Angular 1 to Angular 2 Migrating an application from Angular 1 to Angular 2
Migrating an application from Angular 1 to Angular 2
 
AngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSAngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJS
 
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
 
Introduction to Angular 2
Introduction to Angular 2Introduction to Angular 2
Introduction to Angular 2
 

Similar to 第三回ありえる社内勉強会 「いわががのLombok」

Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義JPCERT Coordination Center
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】株式会社ランチェスター
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
Uehara Junji
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
tnoda
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
Tatsumi Naganuma
 
Kotlin勉強会 in ehime
Kotlin勉強会 in ehimeKotlin勉強会 in ehime
Kotlin勉強会 in ehime
Eigoro Yamamura
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
fumokmm
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
Kenji Nakamura
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
tako pons
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
Shun Nakahara
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
dcubeio
 
Testman
TestmanTestman
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
takezoe
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
Risa Ohnishi
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
 

Similar to 第三回ありえる社内勉強会 「いわががのLombok」 (20)

Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)gen-class とバイトコード(第3回 gen-class 勉強会資料)
gen-class とバイトコード(第3回 gen-class 勉強会資料)
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
 
Kotlin勉強会 in ehime
Kotlin勉強会 in ehimeKotlin勉強会 in ehime
Kotlin勉強会 in ehime
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
Testman
TestmanTestman
Testman
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 

Recently uploaded

2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
CRI Japan, Inc.
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 

Recently uploaded (15)

2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LBカタログ
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 

第三回ありえる社内勉強会 「いわががのLombok」

  • 2. お前だれよ?  twitter: @kiris  いわなが?いわがが?
  • 3. Lombokって何?  http://projectlombok.org  created by  Javaの冗長性を排除する為  Roel Spilker のライブラリ  「赤唐辛子」の意味  v0.10.4  MIT license  Reinier Zwitserloot
  • 4. Javaの冗長性って?  こういうのとか class Data { private int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; } }
  • 5. Javaの冗長性って?  後、こういうのとか… InputStream in = new InputStream(args[0]); try { ... } finally { If (in != null) in.close(); }
  • 6. Javaの冗長性って?  他にも、こういうのとか… Map<String, List<String>> map = new HashMap<String, List<String>>(); ... for(Map.Entry<String, List<String>> entry : map) { ... }
  • 7. Javaの冗長性って?  …… class MyClass { private static Log log = LogFactory.getLog(MyClass.class); private final String name; public MyClass(String name) { if (name == null) { throw new NullPointerException(); } this.name = name; } @Override public int toString() { return “MyClass(name=”+ this.name +“)”; }
  • 8. Javaの冗長性って?   こうならない為のLombok! 続きはWebで!!
  • 9. 冗長の何がいけないの?  生産性が下がる  コード量が増えて読みづらくなる  バグが入り込む可能性がある  死にたくなる
  • 11. Lombokを入手する  Download lombok.jar  http://projectlombok.org/download.html  Maven or Ivy  http://projectlombok.org/mavenrepo/index.html
  • 12. Lombokを使う  Javac  Classpathに追加  GWT  java -javaagent:lombok.jar=ECJ  Play Framework  https://github.com/aaronfreeman/play-lombok#readme  ECJ  java -javaagent:lombok.jar=ECJ -Xbootclasspath/p:lombok.jar -jar ecj.jar -cp lombok.jar
  • 13. LombokをIDEでも使う  Eclipse, NetBeans なんかに対応  IDEA IntelliJはまだ未対応  java -jar lombok.jar
  • 15. @Data import lombok.Data public @Data class DataExample { private final String name; private int count; private List<Object> list; }  @Dataの主な機能  全てのフィールドのgetter / setter の生成  toString, equals, hashCodeの生成  finalフィールドを引数にしたコンストラクタの生成
  • 16. 結果の確認(delombok)  変換後のコードを出力  java -jar lombok.jar delombok -p ${src}  ファイルとして保存  java -jar lombok.jar delombok -d ${output} ${src}  Ant  <delombok verbose="true" encoding="UTF-8" to="$ {output}" from="${src}" />  Maven  https://github.com/awhitford/lombok.maven
  • 17. @Data(変換後) public class DataExample { private final String name; private int count; private List<Object> list; public DataExample(String name) { this.name = name; } public String getName() { return name; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } @Override public String toString() { ... } @Override public boolean equals(Object other) { ... } @Override public int hashCode() { … } }
  • 18. Eclipseからも即時反映  その場でアウトラインや補完候補に表示されます
  • 19. 他の機能  @Getter / @Setter  @Getter(lazy=true)  @ToString  @EqualsAndHashCode  @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor  @Data  @Cleanup  @Synchronized  @SneakyThrows  @Log  val  @Delegate http://projectlombok.org/features/index.html
  • 20. @Getter / @Setter  Getter / Setterの自動生成  @Dataよりも優先 public class GetterSetterExample { @Getter @Setter private String name; @Getter(AccessLevel.PROTECTED) private int age; }
  • 21. @Getter / @Setter(変換後)  Getter / Setterの自動生成  @Dataよりも優先 public class GetterSetterExample { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } protected int getAge() { return age; } }
  • 22. @Getter(lazy=true)  いわゆるメモ化  サブルーチン(関数)呼び出しの結果を保持し、再利用するこ とで、そのサブルーチンの呼び出し毎の再計算を防ぐ public class GetterLazyExample { @Getter(lazy=true) private final double[] cached = expensive(); private double[] expensive() { ... } }
  • 23. @Getter(lazy=true)(変換後)  いわゆるメモ化  サブルーチン(関数)呼び出しの結果を保持し、再利用するこ とで、そのサブルーチンの呼び出し毎の再計算を防ぐ public class GetterLazyExample { public double[] getCached() { // 本当はthread-safe if (!this.$lombok$lazy1i) { this.$lombok$lazy1v = expensive(); this.$lombok$lazy1i = true; } return this.$lombok$lazy1v; } private double[] expensive() { ... } }
  • 24. @Cleanup  リソースの片付けを自動で行なう public static void main(String[] args) throws IOException { @Cleanup InputStream in = new FileInputStream(args[0]); @Cleanup("release") MyResource resource = new MyResource(); ... }
  • 25. @Cleanup(変換後)  リソースの片付けを自動で行なう public static void main(String[] args) throws IOException { InputStream in = new FileInputStream(args[0]); try { MyResource resource = new MyResource(); try { ... } finally { if (resource != null) resource.release(); } } finally { if (in != null) in.close(); } }
  • 26. @Synchronized  this以外のロックオブジェクトで排他 public class SynchronizedExample { private final Object readLock = new Object(); @Synchronized private int foo() { return 1; } @Syncrhonized("readLock") private int bar() { return 2; } }
  • 27. @Synchronized(変換後)  this以外のロックオブジェクトで排他 public class SynchronizedExample { private final Object $lock = new Object(); private final Object readLock = new Object(); private int foo() { synchronized($lock) { return 1; } } private int bar() { synchronized(readLock) { return 2; } } }
  • 28. val  ローカル変数の型宣言を省略 public static void main(String[] args) { val map = new HashMap<String, List<String>>(); ... for(val entry : map.entrySet()) { ... } }
  • 29. val(変換後)  ローカル変数の型宣言を省略 public static void main(String[] args) { final Map<String, List<String>> map = new HashMap<String, List<String>>(); ... for(final Map.Entry<String, List<String>> entry : map.entrySet()) { ... } }
  • 30. etc  @ToString  toStringの生成  @EqualsAndHashCode  equalsとhachCodeの生成  @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor  コンストラクタの生成  @SneakyThrows  チェック例外を非チェック例外のようにthrowする  @Delegate  移譲処理の生成 http://projectlombok.org/features/index.html
  • 31. Lombokのメリット  コードの冗長性の排除  生産性が上がる  コードの見通しを良くなる  バグを埋め込む可能性を減らす  心の平穏
  • 32. Lombokのデメリット  魔法に見える(not WYSIWYG)  Lombokのバグに悩まされる可能性がある  リファクタリング機能との衝突  デバッグがややこしくなる
  • 33. ここまでのまとめ  LombokはJavaの冗長性を排除する  Lombokの導入はとても簡単  魔法には代償をともなう
  • 36. ソースコード生成?バイトコード生成?  いいえ、AST変換です  JavaのASTを直接生成・変換してます  ソースコード生成と違ってコードが膨れあがりません  バイトコード生成と違って同じコンパイル単位のクラスか らも可視的です
  • 37. Lombokが保持するAST  JavacとECJの二つのASTを別々に保持  AnnotationHandlerも各AST毎に実装する必要がある  二つのASTを統合するためのプロジェクトも進行中  https://github.com/rzwitserloot/lombok.ast
  • 39. エントリーポイント  lombok.javac.apt.Processor  implements javax.annotation.processing.Processor  lombok.eclipse.TransformEclipseAST  EclipseのParserにパッチを当てて実行  https://github.com/rzwitserloot/lombok.patcher  OSGi ClassLoaderに注入されて実行される
  • 40. AnnotationHandlerの読み込み  プラグイン形式の読み込み  @ProviderFor(JavacAnnotationHandler.class)  used SPI(http://code.google.com/p/spi/)  Service Provider Interfaceのwrapper
  • 41. ASTの探索  ASTをトラバースしてアノテーションを探索  アノテーションが見付かったら、 対応するAnnotationHandlerのhandleを実行する AnnotationVisitor  Implements JavacASTVisitor  独自のVisitorも定義可能  @ProviderFor(JavacASTVisitor.class)  HandleVal
  • 42. ASTの変換  各AnnotationHandlerや各ASTVisitorで  変換にはJavacなどの非公開APIを直接使用  com.sun.tools.javac.tree  org.eclipse.jdt.internal
  • 44. Lombokを拡張するには?  Lombokは外からの拡張を意識して作っているわけではない  Lombok本体を模範することで拡張することは出来る
  • 45. @Perf  メソッドの実行時間を出力 public class PerfExample { @Perf void foo() { ... } }
  • 46. @Perf(変換後)  メソッドの実行時間を出力 public class PerfExample { void foo() { long $start = System.nanoTime(); try { … } finally { System.out.println(“PerfExample.foo = ”+ System.nanoTime() - $start)); } } }
  • 47. プロジェクトの作り方  prototype: https://github.com/alexruiz/dw-lombok  プロジェクト名などを置換  Ivyの設定を一部変更  ECJのjarが取得出来なかった  Lombokの最新(0.10.4)を使いたかった
  • 48. アノテーションの定義  トリガーとなるPerfアノテーションを作成する @Target({ElementType.METHOD}) @Retention(RetentionPolicy.SOURCE) public @interface Perf { }
  • 49. AnnotationHandlerの作成  Javac用とECJ用の二つのAnnotationHandlerを作成する // for javac package localhost.javac.handlers; @ProviderFor(JavacAnnotationHandler.class) public class HandlePerf extends JavacAnnotationHandler<Perf> { @Override public void handle(AnnotationValues<Perf> annotation, JCAnnotation ast, JavacNode annotationNode) { ... } }
  • 50. AST変換処理の実装  愚直にASTを作るだけの簡単なお仕事 TreeMaker maker = methodNode.getTreeMaker(); // long $start = long t1 = System.nanoTime(); Name startName = methodNode.toName("$start"); JCExpression nanoTimeMethod = chainDotsString(methodNode, "System.nanoTime"); JCExpression nanoTimeApply = maker.Apply(List.<JCExpression>nil(), nanoTimeMethod, List.<JCExpression>nil()); JCVariableDecl startDef = setGeneratedBy(maker.VarDef(maker.Modifiers(0), startName, maker.TypeIdent(getCtcInt(TypeTags.class, "LONG")), nanoTimeApply), ast);
  • 51. テスト  本体が用意しているテスト・インフラがそのまま使える @RunWith(DirectoryRunner.class) public class TestWithEcj implements TestParams { @Override public Compiler getCompiler() { return ECJ; } @Override public boolean printErrors() { return true; } @Override public File getBeforeDirectory() { return new File("test/transform/resource/before"); } @Override public File getAfterDirectory() { return new File("test/transform/resource/after-ecj"); } ... }
  • 52. 拡張されたLombokの実行  jar化してClasspathに追加すれば良い $ ant dist $ javac -cp “.:lib/build/lombok.jar:dist/lombok-perf.jar” Example.java $ java -cp “.”Example
  • 53. 感想  変換処理はわりと愚直にAST作るだけの簡単なお仕事  本体のコードこそが最高のサンプル  https://github.com/rzwitserloot/lombok/tree/master/src/co  https://github.com/rzwitserloot/lombok/tree/master/src/co
  • 54. まとめ  Lombokは皆さんのJava嫌いをちょっとだけ癒してくれます  きっとScalaプログラマにもなれないJavaプログラマの皆さん Lombokを手にいれてみませんか?