2011-12-26 6 views
1

大学のクラスの1つでは、Javaでプログラムを開発する必要があります。要件の1つは、すべてのファイルにパターンsurname_firstname_exerciseN_className.javaを付けることです。別の要件として、プログラムを複数のファイルに分割する必要があります。あなたが想像しているように、これら2つはうまく一緒に遊ばない。ファイルとは異なる名前の公開Javaクラス

私はこれを回避するために、私のクラス名を "翻訳"しています。私は「何か」という名前のクラスを作成した場合、私は私のlong_prefix_something.javaファイルに次の操作を行います。

public class long_prefix_something extends Something {} 

class Something { 
    // class code 
} 

そして、私は別のファイルにクラスのものを使用します。だから私は、他のファイルに次の操作を行います。

class Something2 extends long_prefix_something { } 

私を悩ま何、理由は円形継承エラーの私は戻ってSomethingからlong_prefix_somethingを翻訳することができないということですが、私は代わりにSomething2を使用する必要があります。

これを克服する方法はありますか?使用するアノテーションまたは類似のアノテーション

+4

は、あなたがこのような何かそうする必要があるでしょう、あなたの制約を説明していただけますか? – ziesemer

+1

彼はちょうど醜いクラスの代わりに素敵なクラス名を使用したいと思っています。 – AHungerArtist

+0

また、私はそのような愚かな制約を強制することになった原因を知りたいと思っています。 – AHungerArtist

答えて

0

いいえ、これはJavaでは不可能です。

拡張機能は動作しません。希望のようなエイリアシングはJavaには存在しません。

1

このようなハッキングの必要性は、通常、悪い設計の兆候です。 Javaでは循環(および複数)継承は許可されていません。

1

これは私には少し怖いと思う(他のコメント者と)同意します...しかし、それにもかかわらず、あなたのような問題に対処するためのいくつかのJavaの慣習が存在します。

派生クラスから継承階層の内部Javaクラスを「より分かりやすい」クラスにする必要があるようです。

インターフェイス(コンパイル時)またはリフレクション(ランタイム)の2つの標準的な方法で、あなたのニーズを満たすことができます。

最初の方法:あなたがここに非常に複雑なコードのシナリオを持っているように見えるので、厳密解は明らかではないが

は、 の2つの例は、あなたが持つ問題に対処できるインターフェイスを使用することにより。

1)インタフェース 2に「何かを」変換)クラスSomethingImpl 3にそれらから、ポートimplmentation方法を取る)ただ、「サムシング」インタフェースを実装し、「abcde12345_something」しています。

第2の方法:クラスをイントロスペクションすることによって。

これはやや奇妙なアプローチですが、インターフェイスが機能しない場合は、より多くのフックを追加して他のオブジェクトにどのタイプのものを記述できるかをクラスに追加できます。

1)あなたが「ラッピング」クラスであることは明らかである - ので、あなたはこのように、それぞれが「getRootClass()」メソッドを提供するように、あなたのラップクラスにAPIを追加することができます。

public class abcde_12345_something extends Something implements RootClassProvider{ 
    public Class getRootClass() 
    { 
     return Something.class; 
    } 
} 

2)さて、実行時に - )何らかの理由(あなたができない場合は、「何か」のオブジェクトの上に特殊な論理演算を行う必要があるときは、することができ コール

if(myabcd_12345.getRootClass().isAssignableFrom(Something)) 
    Something s = (Something) myabcd_12345; 
1

私はへの最善の方法を考えます彼らがやろうとしていることは、クラス名を乱雑にするのではなく、パッケージを使うことです...私は、私があなただったら、あなたの先生にそれを示唆してdは:

を、すなわちsurname_firstname.exerciseN.ClassName代わりのsurname_firstname_exerciseN_className.java

関連する問題