繁体   English   中英

该方法返回具有子类字段的超类对象

[英]The method returns a superclass object with subclass fields

我的程序中有一个Movie对象

public class Movie extends BaseDTO {
      ...
      public static class Builder<T extends Builder> extends BaseDTO.Builder<T> { ... }
}

从此对象继承UserMovie

public class UserMovie extends Movie {
     //there are two additional fields
     private final Integer yourRating;
     private final boolean favorited;

     public static class Builder extends Movie.Builder<Builder> { ... }
}

在代码的某些部分中,我想将实体转换为DTO对象。 我有两种方法。 一种将实体转换为Movie DTO的方法

static Movie toMovieDto(final MovieEntity movieEntity) {
    return ((Movie.Builder) initMovieDto(movieEntity)).build();
}

转换为UserMovie DTO的第二种方法

static UserMovie toUserMovieDto(final MovieEntity movieEntity, final UserEntity userEntity) {
    final UserMovie.Builder builder = initMovieDto(movieEntity);

   builder.withYourRating(...);
   builder.withFavorited(userEntity.getFavoritesMovies().contains(movieEntity));

    return builder.build();
}

两种方法都使用通用方法来初始化Builder模式中的数据

private static UserMovie.Builder initMovieDto(final MovieEntity movieEntity) {
    final UserMovie.Builder builder = new UserMovie.Builder(
            movieEntity.getTitle(),
            movieEntity.getType()
    )
            .withId(movieEntity.getId().toString());

    builder.withRating(...);
    ...
    return builder;
}

事实证明, toMovieDto方法返回UserMovie对象。 为什么会这样呢? 我不希望在Movie返回UserMovie私有字段。 如何解决?

您是否担心有人会将从toMovieDto返回的Movie toMovieDtoUserMovie 我不必担心那么多-这需要显式转换。 (比较如何定义Collections类或任何Collection实现中的方法)。

如果您真的担心安全性(并且仅在这种情况下),则需要创建另一个initMovieDto方法,该方法是从Movie而不是像目前那样从UserMovie

所以像这样:

private static Movie.Builder initMovieDto(final MovieEntity movieEntity) {
    final Movie.Builder builder = new Movie.Builder(
            movieEntity.getTitle(),
            movieEntity.getType()
    )
            .withId(movieEntity.getId().toString());
    ...
    return builder;
}

static Movie toMovieDto(final MovieEntity movieEntity) {
    return ((Movie.Builder) initMovieDto(movieEntity)).build();
}

并分别用于UserMovie:

private static UserMovie.Builder initUserMovieDto(final MovieEntity movieEntity) {
    final UserMovie.Builder builder = new UserMovie.Builder(
            movieEntity.getTitle(),
            movieEntity.getType()
    )
            .withId(movieEntity.getId().toString());

    builder.withRating(...);
    ...
    return builder;
}

static UserMovie toUserMovieDto(final MovieEntity movieEntity, final UserEntity userEntity) {
    final UserMovie.Builder builder = initUserMovieDto(movieEntity);

   builder.withYourRating(...);
   builder.withFavorited(userEntity.getFavoritesMovies().contains(movieEntity));

    return builder.build();
}

这样,您不仅将返回所需的接口,还将返回与toMovieDtotoUserMovieDto的返回类型相同类型的具体类。

另一种选择是定义UserMovie构建器,以便其中一个选项可以接受“电影”构建器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM