質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
DTO(Data Transfer Object)

DTO(Data Transfer Object)とは、データを転送するために定義されたクラスのこと。関連データを集約し、データの格納や読み出しのメソッドを定義したオブジェクトです。データを管理するためのフィールド群に対応したセッター・ゲッターで構成されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

2301閲覧

異なるDTOから同じ名前のgetterを使って値を取得することはできますか?

pekopekoapricot

総合スコア24

DTO(Data Transfer Object)

DTO(Data Transfer Object)とは、データを転送するために定義されたクラスのこと。関連データを集約し、データの格納や読み出しのメソッドを定義したオブジェクトです。データを管理するためのフィールド群に対応したセッター・ゲッターで構成されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2022/04/20 00:47

以下のようにgetter / setterが同じ名前のDTOが二つあります。

Java

1public class Test1Dto { 2 private String userId; 3 private String userName; 4 private String address; 5 6 // ======getter / setter は省略 ====== 7}

Java

1public class Test2Dto { 2 private String userId; 3 private String userName; 4 private String address; 5 6 // ======getter / setter は省略 ====== 7}

現在、下記のように三項演算子を使って片方のDTOがNullであれば、もう片方から取得するようにしているのですが、DTOから取得する値が増えた場合、冗長になるなぁと思っています。

Java

1Test1Dto test1Dto = null; 2Test2Dto test2Dto = null; 3 4// =======DTO値取得部分は省略======== 5 6String userId = test1Dto != null ? test1Dto .getUserId() : test2Dto .getUserId(); 7String userName= test1Dto != null ? test1Dto .getUserName() : test2Dto .getUserName(); 8String address= test1Dto != null ? test1Dto .getAddress() : test2Dto .getAddress();

三項演算子以外に、上記の冗長なコードを回避する方法はありますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

interfaceのリストを渡して処理するクラスを作ればいいのではないでしょうか。
※shiketaさんのInterfaceとDTOをパクっています
getter,setter,コンストラクタ書くのダルいのでlombokを使っています。

java

1import java.util.List; 2import java.util.Objects; 3import java.util.function.Predicate; 4import lombok.RequiredArgsConstructor; 5 6@RequiredArgsConstructor 7public class TestDtoFacade { 8 9 private final List<TestInterface> testDtoList; 10 11 public String getUserId() { 12 var dto = this.testDtoList.stream() 13 .filter(Predicate.not(Objects::isNull)) 14 .findFirst(); 15 if (dto.isEmpty()) { 16 return ""; 17 } 18 return dto.get().getUserId(); 19 } 20}

mainの方はlistにDTOを追加するだけです。

Java

1 Test1Dto test1Dto = null; 2 Test2Dto test2Dto = null; 3 4 List<TestInterface> list = new ArrayList<>(); 5 list.add(test1Dto); 6 list.add(test2Dto); 7 8 var facade = new TestDtoFacade(list); 9 String userid = facade.getUserId();

投稿2022/04/20 02:31

編集2022/04/20 02:34
Luice

総合スコア771

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

同じような文が繰り返し書かれていたとしても、それが必要なコードなのであれば、「冗長」ではありません。
それはともかく、機械的に全プロパティーを参照してしまっていいなら、リフレクションを使えば、プロパティーが増えても、コードは変更しなくてすみます。
https://qiita.com/suke_masa/items/0df3bb92bcb69f4a95d1

投稿2022/04/20 02:04

nukasa

総合スコア406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

まず、Test1DtoとTest2Dtoを同様に扱いたいのであれば、インタフェースは必要でしょう。

java

1 interface TestInterface { 2 String getUserId(); 3 } 4 5 public class Test1Dto implements TestInterface { 6 private String userId; 7 private String userName; 8 private String address; 9 10 @Override public String getUserId() { return userId; } 11 } 12 13 public class Test2Dto implements TestInterface { 14 private String userId; 15 private String userName; 16 private String address; 17 18 @Override public String getUserId() { return userId; } 19 }

そのうえで。

三項演算子以外に、上記の冗長なコードを回避する方法はありますでしょうか?

三項演算子がどうしても嫌いなら、こうするかな。

java

1 private void hoge() { 2 TestInterface test1Dto = null; 3 TestInterface test2Dto = null; 4 5 String userId = 6 Optional.ofNullable(Optional.ofNullable(test1Dto).orElse(test2Dto)).get().getUserId(); 7 }

でも、このほうがまだましかも。

java

1 private void hoge2() { 2 Test1Dto test1Dto = null; 3 Test2Dto test2Dto = null; 4 5 TestInterface dto = test1Dto == null ? test2Dto : test1Dto; 6 7 String userId = dto.getUserId(); 8 }

いずれにしても、NEPは発生しますけど。

投稿2022/04/20 02:04

編集2022/04/20 02:09
shiketa

総合スコア4041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問