我的应用程序中有以下样板代码。它可能会在几个不同的对象中重复,包括解析不同类型的对象:
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
AssetTOSaxHandler handler = new AssetTOSaxHandler();
parser.parse( assetStream, handler );
return handler;
由于handler
对象是有状态的,我认为“new”是获得该对象的最佳方式,但我发现factory
和parser
可能是可重用的对象我可能能够注入我的对象而不是实现更清晰的代码。
答案 0 :(得分:0)
如果选择解析器是一个跨领域的问题,并且您打算在多个位置使用它,我会在一个位置定义解析器工厂,并将工厂注入到使用它的那些对象。此外,我不希望更改SAX解析器的每个用户,因为工厂更改。如果他们的任务发生变化,我宁愿让他们改变。
我在几个项目中一直使用Spring,但我对所有正在发生的魔法都不满意。目前我正在寻找更多Guice,在涉及依赖注入方面,这在我看来更具吸引力。如果你使用Spring提供其他服务的话。此外,Guice and Spring can be combined。
注射会像这样
public class Example{
@Inject
private SAXParser parser;
...
AssetToSaxHandler createHandlerFor(final InputStream assetStream) {
AssetTOSaxHandler handler = new AssetTOSaxHandler();
parser.parse(assetStream, handler);
return handler;
}
}
然后你会有一个Guice模块来声明绑定
public class ParserModule extends AbstractModule {
@Override
public void configure() {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
bind(SaxParser.class).toInstance(factory.newSAXParser());
}
}
在初始化课程中,您需要拨打Guice.createInjector(new ParserModule(),...)