gpt4 book ai didi

java - 是否可以在不将对象传递给方法的情况下找到对象的实例?

转载 作者:行者123 更新时间:2023-11-30 07:34:31 25 4
gpt4 key购买 nike

我有一个解析器类“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);
}
}

谢谢

最佳答案

最明显的解决方案是将对 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);
...
}
...
}

看你之前的问题,如果你在 Parser 接口(interface)中添加一个 setParsingProperties 就好了。对于那些不需要属性的解析器,该方法可以作为空方法实现。


关于您的修改:不,不可能这样解决。

MessageObject mobject = (MessageObject) message;

仅当 MessageObjectString 的子类型时才有效(但由于 String 是最终的(无法扩展),因此不能案)。

肮脏的快速修复是检查(使用 instanceof)Parser 是否是 MessageCParser 的一个实例并转换它,然后使用 MessageCParser 特定的解析方法,该方法将 Properties 作为参数。

关于java - 是否可以在不将对象传递给方法的情况下找到对象的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5140795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com