SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Java特有の冗長なコードを簡潔に記述する「Lombok」

  • X ポスト
  • このエントリーをはてなブックマークに追加

委譲

 次は委譲のコードを見てみましょう。委譲とは、別のクラスに機能を任せる際に使われます。継承と似ていますが、オブジェクト指向のis-aの関係になく、単に同じ機能を実装したい場合にはこの委譲が使われれます。Javaの場合は単一継承のみが許されていますので、委譲を使いたい場面がよくあります。

 下記では、CardListというクラスが内包したlistインスタンスに機能を委譲しています。

委譲の実装 Lombok未使用版
public class CardList {
    List<String> list = new ArrayList<String>();
    public boolean add(final String arg0) {
        return list.add(arg0);
    }
    public boolean remove(final Object arg0) {
        return list.remove(arg0);
    }
}

@Delegate

 Lombokでは、@Delegateを利用して委譲を実装できます。

委譲の実装 Lombok使用版
public class CardList {
    @Delegate
    List<String> list = new ArrayList<String>();
}

 @Delegateアノテーションを適用すると、そのフィールドの型に定義された公開メソッドと同じメソッドがフィールドを持つクラスに定義され、そのメソッドが呼び出されると、@Delegateが指定されたインスタンスに処理を委譲します。

同期化

 複数スレッドを使ってプログラムを実行する場合には、必要に応じて処理の同期が必要です。最も単純な同期化はメソッドにsynchronizedを付与することです。

synchronizedメソッドの実装 Lombok未使用版
public class Counter {
    public synchronized void countup() {
        // 同期化された処理
    }
}

 メソッドにsynchronizedを付与するのは下記のコードと同義で、自分自身のインスタンスをロックオブジェクトに指定しています。

 このsynchronizedを付与したメソッドは、常に1つのスレッドでのみ実行されると誤解されがちですが、thisをロックオブジェクトとしてsynchronized宣言しているため、インスタンスが異なれば複数のスレッドから同時に実行されます。

synchronizedメソッドの実装 Lombok未使用版
public class Counter {
    public void countup() {
        synchronized (this) {
            // 同期化された処理
        }
    }
}

 ロックオブジェクトにthisを利用する場合、このインスタンスが参照可能な処理でロックオブジェクトに指定することが可能なため、他の処理でロックオブジェクトに指定するなどして、意図しないロック待ちやデッドロックなどが発生してしまう可能性があります。

 下記のように明示的にロックオブジェクトを実装してしまえば、そのような混乱をさけることが可能です。

synchronizedメソッドの実装 Lombok未使用版
public class Counter {
    private final Object lock = new Object();

    public void countup() {
        synchronized(lock) {
            // 同期化された処理
        }
    }
}

@Synchronized

 Lombokでは、メソッドに付与できる@Synchronizedアノテーションが用意されています。このアノテーションで、上記のように明示的にロックオブジェクトを利用したsynchronizedと同等のことが実現できます。

synchronizedメソッドの実装 Lombok使用版
public class Counter {

    @Synchronized
    public void countup() {
        // 同期化された処理
    }
}
@Setterアノテーション属性の説明
属性 説明
value ロックオブジェクト名を明示的に指定します。

まとめ

 Lombokを使う際の注意点は、Javaの言語仕様とは違った形で実装するため、この仕様に慣れ親しんだプログラマに対しては、一見違和感を与えてしまうことです。

 この点に注意すれば、Javaを使ってより可読性の高いコーディングが可能ですので、使ってみてはいかがでしょうか。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

五座 淳一(株式会社DTS)(ゴザ ジュンイチ)

株式会社DTS 金融企画部所属。主に大規模・金融機関向けシステム開発のアーキテクト担当しています。ウォーターフォール型の開発に、CIなどアジャイル開発のプラクティスを取り入れ、開発プロセスの改善を試みています。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7274 2013/08/20 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング