4

おそらく単純なアーキテクチャ/設計の質問:

私たちのJavaアプリケーションはサードパーティのコードに依存しています。ただし、このサードパーティのコードは、私が気に入らない小さなことを行います(timeZoneをGMTに設定します。アプリケーションのTimeZoneIDに基づいてタイムゾーンを別の方法で設定したいと思います)。私のオプションは何ですか?

1-アプリケーションのいたるところからサードパーティクラスへの呼び出し元が存在するため、サードパーティクラスを単純に拡張して、望ましくない動作をオーバーライドすることはできません(これは、最初にアプリケーションを継承した方法です)。

2-おそらく、あまりにも侵襲的な解決策は、サードパーティのコードに相当する独自のコードを記述し、代わりにそれに依存することです。しかし、それは多分多すぎて侵襲的すぎます。

3-私はSpringAOP(および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 に答える