所以我正在解决以下问题,作为课程作业的一部分:
我的程序接收不同格式的推文,并将其保存为各种查询。主类称为TwitterKnowledgeCenter
,它处理大多数应用程序逻辑。
截至目前,它可以接收两种格式的推文:
15/05/2013 13:08:08, 334611146092994560
{"created_at":"Wed May 15 10:08:07 +0000 2013","id":3346111419..}
我希望TwitterKnowledgeCenter
使用以下调用导入推文:
String[] lines = ...
TwitterKnowledgeCenter tw = new TwitterKnowledgeCenter(...);
tw.import(lines, lineparser)
其中lines
表示格式为#1的推文,而lineparser
是实现TweetParser
接口的类的实例,该接口可以解析从格式#1到Tweet
对象的推文TwitterKnowledgeCenter
成立。
我希望TwitterKnowledgeCenter的用户能够自由地交换推文格式。这意味着他应该可以互换地使用tw.import(lines, lineparser)
和tw.import(jsonTweets, jsonparser)
。
如何使用Guice实现这一目标? 我认为代码应该首先看起来像这样:
String[] lines = ....
String[] jsonTweets = ..
TwitterKnowledgeCenter tw = new TwitterKnowledgeCenter(...);
bind(TweetParser.class).to(JsonParser.class);
<what to write here that'll call tw.import()>
似乎Guice必须根据绑定来处理调用方法import()
。如何实现或不可能实现?
是否有不同的方法来构建这个有意义且有效的方法?
答案 0 :(得分:0)
好的,这是你必须要做的事情。
1.创建两个不同的 guice模块,其中包含每个推文格式的绑定,即line和Json
<强> LineTweetModule.java 强>
public class LineTweetModule extends AbstractModule {
@Override
protected void configure() {
bind(TweetParser.class).to(LineParser.class);
}
}
<强> JsonTweetModule.java 强>
public class JsonTweetModule extends AbstractModule {
@Override
protected void configure() {
bind(TweetParser.class).to(JsonParser.class);
}
}
2.假设班级 TwitterKnowledgeCenter 有一个构造函数,它将TweetParser作为参数。你需要注释那个 带有 @inject 的构造函数,以便明确地被Guice调用
<强> TwitterKnowledgeCenter.java 强>
@inject
public TwitterKnowledgeCenter(TweetParser parser) {
}
3.现在您的客户端代码中,您需要为各自的推文格式创建一个注入器
// To import line format tweets
Injector injector = Guice.createInjector(new LineTweetModule());
TwitterKnowledgeCenter tw = injector.getInstance(TwitterKnowledgeCenter.class);
String[] lines = {},
tw.import(line);
// To import Json format tweets
Injector injector = Guice.createInjector(new JsonTweetModule());
TwitterKnowledgeCenter tw = injector.getInstance(TwitterKnowledgeCenter.class);
String[] lines = {},
tw.import(line);
希望这有帮助。