java - Java运行时需要判断对象的类型。设计不好?

标签 java interface runtime containers typechecking

我正在编写粒子传输代码。在此代码中,物理对象实现了一个接口(interface) Volume。 Volume 的一个实现者是这段代码感兴趣的情况——Particle 类。在我的设计中,卷包含其他卷,一直到最小的卷实现者粒子。只要粒子想要在具有交互作用的体积中不受监控地飞行,这就会非常有效。

但是,当我想要实现某种粒子检测器体积来记录有关粒子的信息时,我遇到了问题。 Volume 接口(interface)不包含获取 Particle 所具有的特殊类型信息的方法。如果粒子进入检测器体积,我将必须执行一些操作,例如使用反射检查其类型,然后再将其从体积转换到粒子并调用粒子方法。一般来说(据我所知)这种类型的事情会被贴上“糟糕的设计”标签。

我可以做到只有粒子可以跨越体积接口(interface)中的体积边界(将接口(interface)与特殊情况的粒子联系起来),但我真的不想在我的代码上强加这个限制。我可能希望允许卷移动并稍后加入。

这听起来是不是一个糟糕的设计?还有其他明显的方法来处理这个问题吗?如果需要,我会附上代码,但一般问题似乎与我的具体情况无关(并且相当独立于语言)。

提前致谢。我真的很感谢这里关于 SO 的所有知识。

最佳答案

据我所知,Java 中的动态转换并不被认为是糟糕的。简单的类型检查比使用完整的 Reflection API 没有那么极端。

您可以尝试动态转换并捕获可能的 ClassCastException,或者在转换之前执行 isinstance Particle 检查。

从概念上讲,粒子实现一个接口(interface)来表明它们拥有粒子检测器想要记录的信息可能更有意义。在不了解更多有关您的设计的情况下,我们无法说。

关于java - Java运行时需要判断对象的类型。设计不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7800860/

相关文章:

java - 此 logback.xml 正在记录到文件但无法记录到控制台?

java - Android ListView - 奇怪的回收行为

实现某个接口(interface)的Java属性

C# 接口(interface)对象列表 - 类型转换单个元素

Java - 为什么系统类和运行时类具有相同的方法?

java - 在 Java 中挂载和解压缩文件

java - 如何通过依赖注入(inject)和垃圾收集来防止循环引用?

java - 错误包 org.apache.pig.FilterFunc 不存在

PHP:我可以在接口(interface)中使用字段吗?

Java:在运行时创建新字符串进行编辑