如果类具有我无法使用的Builder模式,如何正确设置变量

时间:2018-03-27 17:05:30

标签: java spring spring-mvc spring-boot

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

我现在想要为登录用户添加一个评级字段到DTO电影课程。

private Float yourRating;

登录用户的评估将通过下载用户'来获得。来自Spring Security的电影评级

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

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

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字段。它看起来有点奇怪吗?或许你有另一个想法?

1 个答案:

答案 0 :(得分:0)

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

在您的实际主张中,您失去了构建器模式的主要优点(不变性,线程安全性,一致状态)。
我不确定在这些条件下保持它是一个建设者是有帮助的 作为替代方案,您可以重构ServiceUtils类以接受toMovieDto()的重载版本:

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

通过这种方式,您仍然可以使用构建器模式以及其他属性进行设置。