Value Objectとは(VO)
何気にVOとかDtoとかネーミングしていたけどValue Objectというとマーチンファウラーさんのサイトがわかりやすいです。
オレオレ翻訳するとフィールドにはコンストラクタでのみ値を設定(もしくはそれ専用のメソッド)し、フィールドはイミュータブル(不変)であることがValue Objectクラスのあるべき定義みたいです。
setterなどで後から値が変更できる設計のクラスではダメで、インスタンス生成時に全て設定がされているクラス設計というイメージでしょうか。
public final class Takahashi { private final int age; private Takahashi(int age) { this.age = age; } public static Takahashi of(int age) { return new Takahashi(age); } public int getAge() {// getterで取得 return this.age; } }
こんなイメージです。
Takahashi t = Takahashi.of(10000); System.out.println(t.getAge());
結果は以下のようになります。
10000
lombokでいう@Value
lombokでいう@Valueアノテーションをクラスに書くとprivate finalなフィールドとgetterのみのアクセサが用意されます。setterを用意してしまうとDIした後に書き換えることが出来てしまいます。
設定ファイルのクラス(S3Config.java)
package jp.co.confrage.config; import java.util.Map; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import lombok.Value; @Component @ConfigurationProperties(prefix = "spring.aws.s3") @Value public class S3Config { private final Map<String, String> bucket; private final Map<String, String> keys; }
設定ファイル(application.yml)
spring: aws: s3: bucket: name: mybucket keys: sceneslist: var/db/%s.json papilist: etc/settings.json
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント