あまりないかもしれないが、Dtoの各項目を結合したいケース。10個、20個ぐらいならdto.getId + dto.getName + dto.getAddress……でも良いが100個、200個レベルなら辛くなる。コードも長くなるし、見づらいし、結合する順番を間違えてしまうこともある。そんな時はreflect.Fieldクラスがマッチするかも。フィールドの値を動的に取得してくれるので、1つずつゲッターを書かなくても済むためコードの見通しがとても良くなる。
DtoMergerWithStringBuilder.Java
package dev.itboot.mb.service;
import java.lang.reflect.Field;
public class DtoMergerWithStringBuilder {
public static <T> String merge(T dto) {
if (dto == null) {
throw new IllegalArgumentException("DTO must not be null");
}
StringBuilder result = new StringBuilder();
// Dtoのフィールド情報を取得する
Field[] fields = dto.getClass().getDeclaredFields();
for (Field field : fields) {
// プライベートフィールドにもアクセス可能にする
field.setAccessible(true);
try {
Object value = field.get(dto);
if (value != null) {
result.append(value.toString());
}
} catch (IllegalAccessException e) {
throw new RuntimeException("Failed to access DTO fields", e);
}
}
return result.toString();
}
}
SampleDto.Java
package dev.itboot.mb.Dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SampleDto {
private String name;
private Integer age;
private String address;
}
DtoMergerWithStringBuilderTest.Java
package dev.itboot.mb;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import dev.itboot.mb.Dto.SampleDto;
import dev.itboot.mb.service.DtoMergerWithStringBuilder;
class DtoMergerWithStringBuilderTest {
@Test
void testMerge() {
// サンプルDTO
SampleDto dto = new SampleDto("John Doe", 24, "123 Main St");
// マージ処理
String result = DtoMergerWithStringBuilder.merge(dto);
System.out.println("@@@@"+result+"@@@@");
// マージ後の結果を検証
assertEquals("John Doe24123 Main St", result);
}
}
System.out.println(“@@@@”+result+”@@@@”);の部分だが、resultには”John Doe”, 24, “123 Main St”のDtoが結合して1つの文字列として作られている。StringBuilder使えばインスタンス生成しないのでメモリ負荷もたぶん大丈夫。Dto結合、あまりないけどたまにある。なお、少数のフィールド結合ならゲッターで明示的に結合した方が良いと思う。