我有一个解析器类“MessageParser”,我向它传递一个类型为“String”的消息,以便对其进行解析。该类的解析方法签名是
public void parse(String message);
我需要将“Properties”的实例传递给它,但我不想更改方法的签名以向其添加新参数。在过去的几天里,我一直在努力解决这个问题并尝试了几个选项 - 请参阅Sending in an object of type Object instead of String - Polymorphism
调用解析方法“ParserManager”的类知道属性对象。有没有办法让MessageParser找到属性对象而不将其传递给它?
以下是一些示例代码。 我希望“MessageCparser”访问“ParserManager”中的“prop”对象,而不更改“Parser”界面或“ParserManager”类中的任何内容。这可能吗?
public interface Parser{
public void parse(String message);
}
public class MessageCParser implements Parser{
public void parse(String message){
MessageObject mobject = (MessageObject)message;
System.out.println("Parsing C" + mobject.getMessage());
}
public void parse(String m){}
}
import java.util.HashMap;
public class ParserManager{
Properties prop = null;
public ParserManager() {
prepare();
prop = new Properties()
}
HashMap parsers = new HashMap();
public void prepare(){
parsers.put("A",new MessageCParser());
}
public void parseMessage(String msgType, String message){
((Parser)parsers.get(msgType)).parse(message);
}
}
由于
答案 0 :(得分:3)
最明显的解决方案是将Properties
对象的引用添加为ParserManager
中的字段,然后将ParserManager
作为构造函数参数提供属性对象或者通过如下所示的setter方法:
class ParserManager {
...
Properties props;
public void setParsingProperties(Properties props) {
this.props = props;
}
public void parse(String message) {
// props available here, without being passed as agurment.
}
}
class CallingParserManager {
...
void someMethod() {
...
parserManager.setParsingProperties(propertiesToUse);
parserManager.parse(theString);
...
}
...
}
如果你在setParsingProperties
界面中添加了Parser
,我会说你没问题。对于那些不需要属性的解析器,该方法可以实现为空方法。
关于你的编辑:不,不可能像那样解决它。
MessageObject mobject = (MessageObject) message;
仅在MessageObject
是String
的子类型时才会起作用(但由于String
是最终的(无法扩展),但不是这种情况)。
如果instanceof
是Parser
的实例并且强制转换它然后使用MessageCParser
特定解析,那么脏快速修复将检查(使用MessageCParser
)将Properties
作为参数的方法。
答案 1 :(得分:1)
嗯,从广义上讲,有四种获取信息的方式:
当然,所有这些都可以与间接一起使用 - 例如,如果通过上述机制之一可以获得知道Properties
的 else ,那么你可以进入然后找出Properties
。但你不能只找到调用对象并询问那个。
您对Properties
的问题需要做些什么? Properties
是否会因同一MessageParser
的逐个呼叫而异?如果是这样,那么应该是一个参数。你说你不想改变方法的签名 - 但如果你想传递更多信息,那就是你应该做的。
答案 2 :(得分:0)
如果您只有一个“属性”对象实例,则可以使用类似Singleton pattern的内容。
您还可以在MessageParser中的某处添加对ParserManager的引用,然后在ParserManager上调用一个方法,该方法将返回属性,但如果没有一些代码片段,则无法为此提供帮助。