什么是更好的方法?溯造型?接口?抽象类?

时间:2013-12-18 19:46:39

标签: java google-app-engine inheritance google-cloud-datastore object-composition

所有

我必须做错了。这在当时似乎是一个好主意,但随着我对它的深入了解,我认为有一种更合适的编程方式。因此,我问你......

一个注意事项。我正在使用Google AppEngine和数据存储来存储这些信息。

好的......我想说我有一个超级级别的车辆,然后有3个子类......汽车,卡车,摩托车。

在Super Class中,有3个属性......制造商,型号,类型

例如,这些可能是:

  • 制造商:Ford
  • 型号:专注
  • 类型:汽车

所以在数据存储区中,我有许多具有这些属性的Vehicle实体。 因此,如果用户想要看到所有的汽车...我用“汽车”类型拉动每一个。

如果用户想要将这些车辆中的一个添加到“收藏夹”列表中,我会根据它的类型将Vehicle对象转换为其特定的子类。然后,这会添加该特定子类的额外属性。

此新子实体存储在数据存储区中,并添加了其属性。

所以基本上,我正在低调,例如,从车辆到汽车。我通过在Car类中创建一个以Vehicle为参数的额外构造来完成此操作。创建后,Car对象现在具有所有属性(制造商,型号,类型)以及特定实现所带来的所有新属性。

这看似错综复杂。它有效,但必须有一个更好的方法来做到这一点。

我选择这种方式的主要原因是GAE数据存储的工作方式。它“更便宜”存储超级类及其有限的属性并查询它们。长话故事。

我正在尝试使用Interfaces和/或Abstract类来解决这个问题,但我想得到你所有的输入。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我不认为你想要一个超级/子类结构。您所描述的问题是您将对象从一种类型“更改”到另一种类型,并且您无法更改Java对象的类型。您可以创建一个新对象,但是您必须将所有信息从一个移动到另一个,并且维护成为一个问题。

我建议您有一个代表您的车辆的类,并且它包含对特定类型信息的引用;代表每种特定类型的类都可以扩展一些东西,并且可能应该使车辆中试图对该类型做某事的方法可以调用一种常用方法来执行它而不管类型如何。但是这样一旦你决定了特定的类型,就可以将它添加到现有的车辆对象而不是“改变”它。

您还可以探索枚举类型是否可以满足特定于类型的数据的用途 - 枚举类型可以使用构造函数,使用其他方法等等。 - 枚举上的Oracle / Java教程非常清楚。

答案 1 :(得分:0)

车辆类型编码两次:一次作为对象类型,一次作为属性。摆脱其中一个,这样就不可能有一个物业价值设置为Car的Truck(对象类型)。保持您的对象结构或属性指出车辆类型(我建议使用枚举),但不是两者。

要向下转换,您不需要创建子类型的新对象。只是沮丧:

Car myCar = (vehicle instanceof Car ? (Car)vehicle : null);