18
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PLISEAdvent Calendar 2019

Day 6

Lombokの@Getter @Setterの動作メモ

Last updated at Posted at 2019-12-05

はじめに

これはLombokの@Getter, @Setterに絞って動作検証をした結果のメモとなります。
Lombokの導入の仕方や@Getter@Setter以外のアノテーションの使い方は、ここでは書きませんので他の人がまとめてくれているものを見てください。

Lombokについて

本題に入る前に簡単にLombokの説明を。
Lombokとは特定のアノテーションを利用することでgettersettertoStringなどのメソッドを自動で生成してくれるライブラリです。

開発の段階でPOJOオブジェクトなどの記述量を減らすことができます。
今どきgetter、setterを自前で書いている人は少ないかもしれませんが、自動生成のためスペルミスを無くせます。

実践

それではさっそく使ってみましょう。

特定のフィールドに対してgetter、setterを作成したい場合

この場合はgetter、setterを作成したいフィールドに対して@Getter@Setterを付与します。

Product.java
import lombok.Getter;
import lombok.Setter;

public class Product {

	@Getter
	@Setter
	private long id;

	@Getter
	private String name = "マウス";
}

アウトラインを確認するとフィールドに対して指定したgetter、setterが作成されていることがわかります
image.png

実際に動くか確認します。

public static void main(String[] args) {
	Product product = new Product();
	product.setId(1L);

	System.out.println(product.getId());
	System.out.println(product.getName());
}
コンソール
1
マウス

このようにそれぞれ正しく動いていることがわかります。

クラス内にあるフィールドすべてにgetter、setterを作成したい場合

先ほどフィールドに対して@Getter@Setterを付与しましたが、この場合はクラスに対して@Getter@Setterを付与します。

Product.java
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Product {

	private long id;

	private String name;
}

クラス内にあるフィールドすべてにgetter、setterが作成されていることがわかります。
image.png

動作検証は省略します。

getterは全フィールドへsetterは一部のフィールドへ作成したい場合

この場合は全フィールドへ適用したいものはクラスへ、一部のフィールドへ適用したいものはフィールドへ、それぞれのアノテーションを付与します。

Product.java
import lombok.Getter;
import lombok.Setter;

@Getter
public class Product {

	@Setter
	private long id;

	private String name;
}

image.png

指定した通りidにしかsetterは作成されていないですね。

一部のフィールドだけgetter、setterを作成したくない場合

クラス内のほぼすべてのフィールドにはgetterとsetterを作成したいけど、一部のフィールドには作成したくない場合はAccessLevel.NONEを指定します。
AccessLevelでは作成されるgetter、setterのアクセス修飾子を変更でき、何も指定しない場合はpublicとなります。

Product.java
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Product {

	@Getter(AccessLevel.NONE)
	private long id;

	@Setter(AccessLevel.NONE)
	private String name;
}

image.png

このようにAccessLevel.NONEを指定したgetter、setterが作成されていないことがわかります。

getter、setterの動作をデフォルトから変えたい場合

開発しているとクラス内の一部だけgetterやsetterの動作を変えたい場合に遭遇します。
その場合には自前で動作を変えたいフィールドのgetter、setterを実装します。
今回はnameフィールドのgetterだけ自前で実装してみましょう。

Product.java
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Product {

	private long id;

	private String name;

	public String getName() {
		return "商品名: " + name;
	}
}

アウトラインからは順序が変わりましたが、getterがあることは分かります。
image.png

先ほどと同じように動かしてみましょう。

public static void main(String[] args) {
	Product product = new Product();
	product.setId(1L);
	product.setName("キーボード");

	System.out.println(product.getId());
	System.out.println(product.getName());
}
コンソール
1
商品名: キーボード

とこのように自前で実装したgetterが呼ばれていることがわかります。

##まとめ

  • 一部のフィールドにgetter、setterを作成したい場合は、フィールドに対してアノテーションを付与する。
  • クラスのフィールドに共通的にgetter、setterを作成したい場合は、クラスに対してアノテーションを付与する。
  • 一部のフィールドのgetter、setterを作成したくない場合は、AccessLevel.NONEを指定する。
  • getter、setterの動作を単純な値取得、値セットから替えたい場合は、自前でgetter、setterを作成する。

##参考

18
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?