如何解决Java记录中的Demeter违反定律?

问题描述 投票:0回答:1

我在 Quarkus 应用程序中使用以下记录,有时我需要访问位于语句嵌套记录中的 requestId 字段。我想避免使用嵌套记录提供的 getter,因为这会违反 Demeter 定律。我尝试在 KYAAutoResponse 记录中添加第五个名为 Statements 的字段,然后使用自定义方法自动获取 requestId 的访问权限,但这会返回 null。

我对如何绕过违规行为感到有点困惑。你能帮我吗?

public record KYAAutoResponse(
        DataTransFlowAccessOutputRecord dataTransFlowAccessOutputRecord,
        long callSequenceId,
        String callSequenceDate
) {
    public record DataTransFlowAccessOutputRecord(
            Data data
    ) {
        public record Data(
                Document document
        ) {
            public record Document(
                    Statements statements
            ) {
                @JsonInclude(JsonInclude.Include.NON_NULL)
                public record Statements(
                        @JsonProperty("request-id") String requestId,
                        @JsonProperty("consent_content") String data
                ) {}
            }
        }
    }
}
java record getter law-of-demeter
1个回答
0
投票

如果我理解正确的话,你希望能够做到

kyaAutoResponse.requestId()

这将允许您执行此操作:

public record KYAAutoResponse(
    DataTransFlowAccessOutputRecord dataTransFlowAccessOutputRecord,
    long callSequenceId,
    String callSequenceDate
) {
    public record DataTransFlowAccessOutputRecord(
        Data data
    ) {
        public record Data(
            Document document
        ) {
            public record Document(
                Statements statements
            ) {
                @JsonInclude(JsonInclude.Include.NON_NULL)
                public record Statements(
                    @JsonProperty("request-id") String requestId,
                    @JsonProperty("consent_content") String data
                ) {}
            }
        }
    }

    @JsonIgnore
    public Optional<String> requestId() {
        if (dataTransFlowAccessOutputRecord == null) return Optional.empty();
        if (dataTransFlowAccessOutputRecord.data == null) return Optional.empty();
        if (dataTransFlowAccessOutputRecord.data.document == null) return Optional.empty();
        if (dataTransFlowAccessOutputRecord.data.document.statements == null) return Optional.empty();
        return Optional.ofNullable(dataTransFlowAccessOutputRecord.data.document.statements.requestId);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.