4

一个简单的建筑/设计问题:

我们的 Java 应用程序依赖于第三方代码。但是,这个第三方代码做了一些我不喜欢的事情(将时区设置为 GMT;我想根据应用程序的 TimeZoneID 设置不同的时区)。我有哪些选择?

1-我不能简单地扩展第三方类并覆盖不受欢迎的行为,因为在我们的应用程序中到处都有对第 3 方类的调用者(这是我们开始继承应用程序的方式)。

2-也许过于侵入性的解决方案是编写我们自己的等效第三方代码并依赖它。但是,这可能太多了,太具有侵略性了。

3-我看了一点Spring AOP(和aspectJ)的东西来做加载时间编织。我没有深入研究它,但在我看来,因为第三方代码调用 java.util.Timezone.setDefault(GMTTimeZone); (而不是调用我们自己编写/管理的类)这不是那么容易做到的。我在这里可能是错的,也许我仍然可以在 java.util.Timezone.setDefault() 周围编织。请让我知道这是否属实,这几乎是我的(唯一)解决方案。

4-我错过了什么,或者这几乎是所有可用的选项?

4

3 回答 3

3

首先,您可以联系第三方并要求他们更改代码。它并不像你想象的那么长。它惹恼了你,可能还有他们的其他客户。

此外,您只能将子类用作代码的代理。您项目中的其他人不一定必须使用您的子类。您可以清理不受欢迎的行为并从代码中抽象出更改。当要求他们改变行为时,您也可以将此代码发送给供应商!

最后,最简单的解决方案是只获取返回值并在线修复它。这是现在完成它的最快方法,但它不是一个好的模式,因为您引入的代码仅用于解决其他人的问题。

于 2012-08-17T18:55:57.633 回答
1

从您的类扩展该类并在您的子类中覆盖该方法(根据您的要求填充代码),但该类和方法不应在该第三方代码中声明为 final。

ThirdPartyClassName obj=new YourSubClassName();

    obj.yourOverridenMethod()

这将调用您的子类的重写方法,所有其他调用将调用第三方类的原始方法

于 2012-08-17T19:05:18.517 回答
0

您可能非常受限于您发布的内容。正如 smcg 所说,最好分叉代码(如果可能)并简单地更改代码然后重新编译它。在 AOP 上,如果您可以修补代码,那么您可以替换在时区调用 setDefault() 的方法。

于 2012-08-17T18:56:34.490 回答