[英]Why the superclass variable gets called though the method returns subclass object?
[英]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
toMovieDto
为UserMovie
? 我不必担心那么多-这需要显式转换。 (比较如何定义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();
}
这样,您不仅将返回所需的接口,还将返回与toMovieDto
和toUserMovieDto
的返回类型相同类型的具体类。
另一种选择是定义UserMovie构建器,以便其中一个选项可以接受“电影”构建器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.