gpt4 book ai didi

java - 如果类具有我无法使用的构建器模式,如何正确设置变量

转载 作者:太空宇宙 更新时间:2023-11-04 10:35:37 25 4
gpt4 key购买 nike

我有一个简单的 DTO 类。 电影 https://github.com/JonkiPro/REST-Web-Services/blob/master/common/src/main/java/com/common/dto/Movie.java该类具有 Builder 模式,要创建对象,您必须在构造函数中指定两个强制参数 titletype。实体 MovieEntity 在此处映射到 DTO Moviehttps://github.com/JonkiPro/REST-Web-Services/blob/master/core/src/main/java/com/core/jpa/service/ServiceUtils.java71 行内。 ServiceUtils 类不是 Spring 组件,而只是一个常规的 Utils 类。

我现在想要将登录用户的评级字段添加到 DTO Movie 类。

private Float yourRating;

对登录用户的评估将通过从 Spring Security 下载用户对电影的评分来获得

Float yourRating = movieSearchService.getRating(principalLoggedUser, movieId);

我无法使用 ServiceUtils 类中的 Builder 模式以任何方式设置 myRating 字段,因为该方法仅接受电影的实体。我只能想到一种方法。

public Movie getMovie(
@Min(1) final Long id
) throws ResourceNotFoundException {
log.info("Called with id {}", id);

Movie movie = ServiceUtils.toMovieDto(this.findMovie(id));
movie.setYourRating(movieSearchService.getRating(principalLoggedUser, movieId));
return movie;
}

您认为如何借助Builder模式设置DTO对象的基本数据,然后使用setter设置yourRating字段。是不是看起来有点奇怪?或者也许您有其他想法?

最佳答案

定义与特定连接用户相关的信息的 Movie 类真的有意义吗?
从概念上讲,这些是不同的东西。引入一个类作为 MovieUserRating (使用或不使用 Builder)似乎是一个更好的选择,并且可能会解决您的问题。

<小时/>

在您的实际主张中,您失去了构建器模式的主要优点(不变性、线程安全、一致状态)。
我不确定在这种情况下将其保留为构建器是否有帮助。
作为替代方案,您可以重构 ServiceUtils 类以接受 toMovieDto() 的重载版本:

Float yourRating = movieSearchService.getRating(principalLoggedUser, movieId);
Movie movie = ServiceUtils.toMovieDtoWithRating(this.findMovie(id), yourRating);

通过这种方式,您仍然可以使用构建器模式以及要设置的附加属性。

关于java - 如果类具有我无法使用的构建器模式,如何正确设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49518658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com