在彼此之间铸造子实体

时间:2012-04-07 09:10:17

标签: java jpa

我有以下型号:

abstract Article {id, name, text}

final NewspaperArticle { printDate } extends Article

final ScientificArticle { quotations, publicationDate } extends Article

final ... { ... } extends Article

我想知道如何在彼此之间实现最终实体的转换,以便设置Article超类的公共字段,并且不同的字段将保持为null。类似的东西:

ScientificArticle scientificArticle = ...;
NewspaperArticle newspaperArticle = new NewspaperArticle();
newspaperArticle.copyOf(scientificArticle);

是否可以施放它,否则我将不得不使用反射?

2 个答案:

答案 0 :(得分:2)

你不能这样做,因为正如你所说,NewspaperArticle有一些科学武器没有的信息(例如字段)。我也不知道你想用反射实现这一目标。即使你可以,如果你不得不依赖这样的东西,这将是一个糟糕的阶级设计的标志。

答案 1 :(得分:1)

简短地回答你的问题:不,你不能将一个对象强制转换为另一个类。您可能只会转换为对象真实类的超类型。 (一个类本身也是一种超类型。)

但是,您可以使用合成而不是继承:

interface Article { ArticleData getArticleData(); }

final ArticleData {id, name, text}

final NewspaperArticle { articleData, printDate } implements Article

final ScientificArticle { articleData, quotations, publicationDate } implements Article

final ... { articleData, ... } implements Article

然后你可以为每个类添加一个像NewspaperArticle(Article createFrom)这样的构造函数来设置文章数据字段,并将其他字段留空:

class NewspaperArticle {
  ArticleData articleData;
  Date printDate = null;

  NewspaperArticle(Article createFrom) {
    this.articleData = createFrom.getArticleData();
  }
}

您的示例将如下所示:

ScientificArticle scientificArticle = ...;
NewspaperArticle newspaperArticle = new NewspaperArticle(scientificArticle);