【发布时间】:2011-04-22 01:30:18
【问题描述】:
我已阅读其他相关帖子,但仍不太确定如何使用 Java 进行动态转换,或者是否可以动态转换(接口到实现)。我的印象是我必须使用反射来做到这一点。
我正在处理的特定项目需要使用许多 instanceof 检查,而且在我看来,它有点失控,所以如果有任何想法/解决方案,我将不胜感激。
下面是我写的一个小例子,只是为了明确我想要做什么。如果您需要更多信息,请告诉我:
界面:
public interface IRobot {
String getName();
}
实现:
public class RoboCop implements IRobot {
String name = this.getClass()+this.getClass().getName();
public RoboCop() {}
public String getName() { return name; }
}
public class T1000 implements IRobot {
String name = this.getClass()+this.getClass().getName();
public T1000() {}
public String getName() { return name; }
}
处理实现的类:
import java.util.LinkedList;
import java.util.List;
public class RobotFactory {
public static void main(String[] args) {
new RobotFactory();
}
public RobotFactory() {
List<IRobot> robots = new LinkedList<IRobot>();
robots.add( new RoboCop() );
robots.add( new T1000() );
System.out.println("Test 1 - Do not cast, and call deploy(robot)");
for(IRobot robot : robots) {
deploy(robot); // deploy(Object robot) will be called for each..
}
System.out.println("Test 2 - use instanceof");
for(IRobot robot : robots) { // use instanceof, works but can get messy
if(robot instanceof RoboCop) {
deploy((RoboCop)robot);
}
if(robot instanceof T1000) {
deploy((T1000)robot);
}
}
System.out.println("Test 3 - dynamically cast using reflection?");
for(IRobot robot : robots) {
//deploy((<Dynamic cast based on robot's type>)robot); // <-- How to do this?
}
}
public void deploy(RoboCop robot) {
System.out.println("A RoboCop has been received... preparing for deployment.");
// preparing for deployment
}
public void deploy(T1000 robot) {
System.out.println("A T1000 has been received... preparing for deployment.");
// preparing for deployment
}
public void deploy(Object robot) {
System.out.println("An unknown robot has been received... Deactivating Robot");
// deactivate
}
}
输出:
[RoboCop@42e816, T1000@9304b1]
Test 1 - Do not cast, and call deploy(robot)
An unknown robot has been received... Deactivating Robot
An unknown robot has been received... Deactivating Robot
Test 2 - use instanceof
A RoboCop has been received... preparing for deployment.
A T1000 has been received... preparing for deployment.
Test 3 - dynamically cast using reflection?
所以,总结一下我的问题,在这种情况下,我怎样才能完全避免使用instanceof。谢谢。
【问题讨论】:
-
+1 用于酷机器人示例 :-)
-
谢谢,我试着让阅读变得有点有趣,呵呵 :)
-
不必使用 instanceof 或 cast 通常意味着您的设计存在问题。这并不总是正确的,但如果它经常发生,那么几乎可以保证那里有更好的设计。在这种情况下,为什么不在robot中部署一个方法——你使用的system.out.println绝对应该在robot内部。如果deploy不能是robot中的方法,那么它应该只调用robot接口中的方法(这样你只需要一个deploy方法)。
-
@Bill 是的,我承认,在这个例子中,现在很容易看出这一点。我不得不退出实际的部署代码,这并不那么明显(或者至少对我来说不是)。 Meriton 的
Vistor pattern是我最终诉诸并将申请的。
标签: java reflection dynamic casting