向下投射与多个领域

时间:2016-10-04 15:40:46

标签: java interface downcast

我经常读到关于降级是一件坏事,现在我需要它,我会问自己在我的例子中有什么替代方案:

我有Interface A

实现接口A的三个类:X1, X2, X3

这些类描述相同的内容,但是使用不同的“格式”和过程(简单地说),这就是为什么我必须将它们分开。

现在我有一个课程如下:

class Test { A obj; }

根据“格式”,我会obj = new X1(), obj = new X2() or obj = new X2()

从现在开始,在处理对象时(除了A中的方法),我必须在此类中使用大量的向下转换来访问类方法。我看到的唯一选择是为每个可能的类创建一个字段,其中只有一个被使用过。这似乎也很糟糕。

有关如何改善设计的建议吗?

感谢您的帮助。

编辑:这是我的方案(简单地说):

我的主类是某些数据的容器。其中一个是内容属性(有点像HTTP请求的主体)。内容可以是:

  • 纯文本(两个单独的字符串)
  • 文件(只是文件路径,md5等) - >稍后将加载到输入流中。
  • unknown(字节) - >我不能和我实际上不必知道。稍后的上下文将为我提供有关它的信息。

对于每种类型,我创建了一个Class(TextContent,FileContent,UnknownContent)。它们实现了具有getBytes()方法的接口内容,该方法将内容作为字节数组返回。

内容的使用:

  1. 创建
  2. ContainerClass.setContent(plainText) - > BaseInterface content = new TextContent(plainText) ContainerClass.setFile(file) - > BaseInterface content = new FileContent(file) ContainerClass.setContent(someBytes) - > BaseInterface content = new UnknownContent(someBytes)

    1. 我的Container对象可以保存到json。内容对象只会保存,如果它是Text或File(因此我无法在界面中实现toJsonObject())。

    2. 当内容是文本时,我想检查某些模式。我在容器类之外使用Matcher类(例如((TextContent)container.content).getText() - >执行此操作;遗憾的是,FileContent没有可以返回的单个文本,因此我也无法实现该文本。我可以在我的容器类中添加一个getContentAs ..()方法,它将适当地转换它,但我觉得我只是解决了潜在的问题:(

1 个答案:

答案 0 :(得分:-3)

由于数据相同,听起来你只想要一个类,而不是多个。保持格式与数据分开。