在以下情况下,是否有更创新的方式来处理空异常?

Is there a more innovative way to handle null exceptions in the following cases?

现在我已经为 Puppy 创建了一个 Response

@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PUBLIC)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PuppyResponse {

    private Long puppyId;

    private String name;

    private Integer age;

    private String breed;

    private Long vetId;

    private String vetName;

    public PuppyResponse(Long puppyId, String name, Integer age, String breed) {
        this.puppyId = puppyId;
        this.name = name;
        this.age = age;
        this.breed = breed;
    }

    public static PuppyResponse of(Puppy puppy) {
        Optional<Vet> vet = Optional.ofNullable(puppy.getVet());
        if(vet.isPresent()) {
            return new PuppyResponse(
                    puppy.getPuppyId(),
                    puppy.getName(),
                    puppy.getAge(),
                    puppy.getBreed(),
                    vet.get().getVetId(),
                    vet.get().getName()
            );
        }else {
            return new PuppyResponse(
                    puppy.getPuppyId(),
                    puppy.getName(),
                    puppy.getAge(),
                    puppy.getBreed()
            );
        }
    }

    public static List<PuppyResponse> listOf(List<Puppy> puppies) {
        return puppies.stream()
                .map(PuppyResponse::of)
                .collect(Collectors.toList());
    }
}

dog 属性 vet 可能为 null。 我将 Puppy 设计为根据它是否为 null 使用不同的构造函数,但这似乎不是一个好方法。 当然它没有问题,但我想以更好的方式设计它。我如何处理空值?

如果 puppy.getVet() 为 null,您只想通过使用 orElseGet

提供新的 Veet 对象
Vet vet = Optional.ofNullable(puppy.getVet()).orElseGet(Vet::new);

如果 puppy.getVet() 为 null

如果您想提供默认的 Veet 对象
Vet vet = Optional.ofNullable(puppy.getVet()).orElseGet(PuppyResponse::getDefaultVet);

这样您就不需要检查 ifPresent 并相应地创建响应

return new PuppyResponse(
    puppy.getPuppyId(),
    puppy.getName(),
    puppy.getAge(),
    puppy.getBreed(),
    vet.getVetId(),
    vet.getName()
);

提供默认 Vet 对象

private static Vet getDefaultVet(){
    Vet v = new Vet();
    v.setVetId(0);
    v.setName("Default Name");
    return v;
}