2012-05-13 11 views
1

一部のプログラミング言語には、クラスに「カテゴリ」(たとえばObjective-C)を追加する機能があります。これは、サブクラス化せずにクラスに新しい機能を追加することを意味します。Javaのクラス分類をシミュレートする方法

本当に便利だと思いますが、Javaでこの機能をシミュレートする方法は想像できません。

そこで質問です:

Javaでクラスカテゴリをシミュレートするエレガントなパターンをどのように見えますか?私が本当に探しているのは、同じようにするのではなく、同じ効果を達成することです。

+0

短い答え:なし、サブクラス化以外の方法、あるいはUtilクラスを提供するだけです –

+0

私はそれをまったく同じ方法にしていますが、同じ効果を達成することについては言いません。 –

+0

"javaウェイ"はサブクラス化または合成を使用しています。 CUtilsを作成する –

答えて

1

AspectJinter-type declaration featureを使用すると、既存のクラスに機能を追加できます。

+0

これは私が探しているものです!ありがとう –

+2

@Juan AlbertoLópezCavallotti、AspectJは、バイトコードの変更を行う一般的なライブラリの1つです。これは私が実際に言おうとしたことです... – AlexR

+0

@AlexRはじめにAspectJは、Javaプログラミング言語のシームレスなアスペクト指向の拡張です。 JavaおよびAspectJコード用の完全なコンパイラを備えています。もちろん、既存のクラスを変更することもできますが、そのような機能はむしろ副次的なものです。 AspectJをバイトコード変更ライブラリとして呼び出すのは、Javaコンパイラでバイトコード生成フレームワークを呼び出すのと同じです。 –

0

2通りの方法があります。

ダイナミックプロキシを使用できます。この機能は、JVMが実行時にあなたのためのインターフェイスを「実装」し、コールバックメソッドを実装して「実際の」実装を呼び出すことができることを意味します。

他の方法はバイトコードエンジニアリングです。しかし、IMHOの最初の方法は簡単です。

+0

私は実際にバイトコードを変更するのではなく、デザインパターンを探していますが、とにかく感謝しています。 –

1

Java 8では、インターフェイス注入(既存のクラスに新しいinterfaceを追加する)とデフォルトメソッド(interfaceメソッドのデフォルト実装を提供する)の組み合わせによってこれを実行できます。

+0

私はJava 8の新しい機能について知りませんでした。それに対して+1です。しかし、私は現在のJavaで使うパターンを探しています。 –

関連する問題