【发布时间】:2011-02-27 16:49:33
【问题描述】:
我有一个看起来像这样的现有方法:
public void parseMessage(String message){
...
...
...
}
并通过如下所示调用方法来调用它
String message;
parseMessage(message);
我需要对其进行修改以使其处理新类型的消息。从 parseMessage 方法调用的新型消息的解析器在解析消息之前首先需要一些属性。我正在考虑做的是将消息作为一个看起来像这样的对象传递
public class MessageObject{
private String message;
private String namespace;
private String xmlVersion;
}
然后我可以将现有方法称为
Object messageObject;
parseMessage(messageObject);
然后我可以通过将其转换为 (MessageObject)messageObject 来在另一端使用它。
这是正确的方法还是有更好的方法。进行上述操作有什么危险吗?
ps。我必须使用上面的转换方法,因为我使用 JDK1.4
谢谢
更新
我无法修改 parseMessage 方法。它内部有一个调用,它为每个相关的解析器调用 parse() 方法。
public void parseMessage(String message){
...
...
parser.parse(message)
}
上面显示的解析器引用是一个实现接口“解析器”的对象。我介绍的新解析器遵循这个结构,它还实现了“解析器”接口。唯一的修改(即转换为 MessageObject)在新的解析器中。
我无法更改现有的 parseMethod,因为这将需要更改所有实现“解析器”接口的现有解析器。我想避免根据消息类型调用特定的解析器。
如果我使用我建议的方法,现有解析器仍会收到字符串消息,而新解析器将收到字符串,但需要先将其转换回 MessageObject。
编辑
我不得不根据 Sergey 的 cmets 对此进行测试。
界面
package com;
public interface Parser{
public void parse(String message);
}
package com;
消息解析器
public class MessageAParser implements Parser{
public void parse(String message){
System.out.println("Parsing A");
}
}
MessageB 解析器
package com;
public class MessageAParser implements Parser{
public void parse(String message){
System.out.println("Parsing A");
}
}
MessageC 解析器(这需要一个对象)
package com;
public class MessageCParser implements Parser{
public void parse(Object message){
MessageObject mobject = (MessageObject)message;
System.out.println("Parsing C" + mobject.getMessage());
}
public void parse(String m){}
}
调用相关解析器的解析器管理器。
package com;
import java.util.HashMap;
public class ParserManager{
public ParserManager() {
prepare();
}
HashMap parsers = new HashMap();
public void prepare(){
parsers.put("A",new MessageAParser());
parsers.put("B",new MessageBParser());
parsers.put("C",new MessageCParser());
}
public void parseMessage(String msgType, String message){
((Parser)parsers.get(msgType)).parse(message);
}
}
package com;
控制器。
public class ControlClass{
public static void main(String[] args){
ParserManager pManager = new ParserManager();
//Parse A
pManager.parseMessage("A","ATEXT TO PARSE");
//Parse B
pManager.parseMessage("B","BTEXT TO PARSE");
//Parse C
Object mobject = new MessageObject();
pManager.parseMessage("C",(String)mobject);
}
}
当我运行上面的 Controller 类时,它输出前两条消息的文本,但第三条消息失败。
Parsing A
Parsing B
java.lang.ClassCastException
at com.ControlClass.main(ControlClass.java:17)
Exception in thread "main"
【问题讨论】:
标签: java interface casting polymorphism