我正在用Java编写一个库。主应用程序引用库中的对象。
应用程序需要在其某个对象的某个点上调用方法。 库对象想要在应用程序中使用参数调用此方法。
我不想要将应用程序对象作为引用传递给库对象,因为我希望它松散耦合并且Application对象特定于该应用程序。如果我只是作为Object数据类型传递它,它将不会附加方法而不是没有强制转换的那种类型。
因为它们是独立的罐子,所以静态也不起作用,并希望它再次松散耦合。
示例
应用程序A正在运行并已观看课程。在它自己的罐子里。
public class WatchedInApplication extends BaseRichBolt {
// has a reference to the lib class
private WatcherInLibrary lib;
...
public void invoke (string.. args) {
// invoke this method from another jar reference as a API.
// to replay some data.
outputCollector.emit(args)
}
}
库B由应用程序A引用,它想要在某个点调用应用程序A中的对象中的方法。这个库B也是另一个运行和监视应用程序A的jar。
public class WatcherInLibrary {
public void invokeApplicationsinvokeMethod() {
// invoke the applications method invoke, but with no specific reference to it
// basically want to invoke the output collector.emit to replay tuples.
}
}
点
我可以简单地将outputcollector或BaseRichBolt传递给库类B.但我想保持松散耦合。此外,两个应用程序都引用了Storm,这可能会导致未来的问题,即使没有问题,如果我开始传递outputcollector或BaseRichBolt,它也会与Storm紧密相关。
答案 0 :(得分:0)
评论之后很简单。使用定义invoke(args)方法的接口。在Bolt对象上实现接口。然后可以传递它并且是通用的。然后从库方法调用。
快速玩具示例,可以通过界面上的泛型来改进。
WatchedApplication
public class WatchedInApplication implements Invoke {
private WatcherInLibrary lib;
public WatchedInApplication(WatcherInLibrary lib) {
super();
this.setLib(lib);
}
public WatcherInLibrary getLib() {
return lib;
}
public void setLib(WatcherInLibrary lib) {
this.lib = lib;
}
// where the method is implemented.
@Override
public void invokeRemote(String data) {
System.out.println("Method Invoked " + data.toString());
}
}
WatcherLibrary
public class WatcherInLibrary {
private Invoke obj;
public void setWatchedApplication(Invoke object) {
this.obj = object;
}
public void invokeRemoteObject() {
this.obj.invokeRemote("data passed");
}
}
界面解决方案
public interface Invoke {
public void invokeRemote(String data);
}
主要示例
WatcherInLibrary lib = new WatcherInLibrary();
WatchedInApplication watched = new WatchedInApplication(lib);
lib.setWatchedApplication(watched);
lib.invokeRemoteObject();
使用该接口可使此解决方案适用于任何数据类型。