是否有可能在没有传递给方法的情况下找到对象的实例?

时间:2011-02-28 10:29:44

标签: java class-design classloader

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

由于

3 个答案:

答案 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;

仅在MessageObjectString的子类型时才会起作用(但由于String是最终的(无法扩展),但不是这种情况)。

如果instanceofParser的实例并且强制转换它然后使用MessageCParser特定解析,那么脏快速修复将检查(使用MessageCParser)将Properties作为参数的方法。

答案 1 :(得分:1)

嗯,从广义上讲,有四种获取信息的方式:

  • 它可以是调用该方法的对象状态的一部分(例如,它可以传递给构造函数,然后保留在字段中)
  • 它可以是方法本身的参数
  • 可以静态访问,例如通过单身人士
  • 可以通过线程局部变量
  • 访问它

当然,所有这些都可以与间接一起使用 - 例如,如果通过上述机制之一可以获得知道Properties else ,那么你可以进入然后找出Properties。但你不能只找到调用对象并询问那个

您对Properties的问题需要做些什么? Properties是否会因同一MessageParser的逐个呼叫而异?如果是这样,那么应该是一个参数。你说你不想改变方法的签名 - 但如果你想传递更多信息,那就是你应该做的。

答案 2 :(得分:0)

如果您只有一个“属性”对象实例,则可以使用类似Singleton pattern的内容。

您还可以在MessageParser中的某处添加对ParserManager的引用,然后在ParserManager上调用一个方法,该方法将返回属性,但如果没有一些代码片段,则无法为此提供帮助。