あまりないかもしれないが、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結合、あまりないけどたまにある。なお、少数のフィールド結合ならゲッターで明示的に結合した方が良いと思う。