OSGI BundleActivator的start
和stop
方法都用throws Exception
声明。与此同时,Joshua Bloch在其著作《高效Java,第二版,第62项》中说
永远不要声明方法"抛出异常"
那么,在BundleActivator
中,这是一个糟糕的设计决策,还是这种普遍性在这种情况下是合理的?为什么?
throws
子句的情况下声明start
和stop
方法。(或者您可以用任何java.lang.Exception
子类声明这些方法。)
另一方面,特定的,例如
void start(BundleContext context) throws BundleActivatorException
方法不会有太大改变。它只会让实现者捕获他们的异常,并重新将其封装在BundleActivatorException
中。由于每个异常都会使bundle激活变得毫无意义,所以这个try-catch
块实际上是不必要的,所以抛出java.lang.Exception
更容易。
从start()
或stop()
方法抛出异常表示出现了严重错误,不应进行捆绑包生命周期更改。由于我们将检测情况(通过bundle)和处理情况(通过框架)的关注点分开,抛出Exception
是唯一合理的做法。
我认为Josh Bloch的建议不合时宜。throws Exception
没有任何问题。它让你可以选择抛出任何你喜欢的异常,OSGi框架会处理它
请注意,您永远不需要自己调用这些方法。