2015-01-06 24 views
5

私は、インターフェイスを実装するユーザーを強制的に探し出す方法や、いくつかのコンストラクタを作成するクラスを拡張しようとしています。抽象クラスで抽象コンストラクタを作成する方法があると思っていましたが、私はそれができないと考えました。Java抽象クラス、抽象コンストラクタ

どうすればこの問題を解決できますか?ユーザーに特定のコンストラクタを作成させるいくつかの方法がありますか?

ありがとうございます!

+1

何コンストラクタあなたが実現したいですか(なぜ)? – ErstwhileIII

+0

空のコンストラクタとコピーコンストラクタです。しかし、私は一般的な目的のために知りたいので、私は質問を入れます。 – yonutix

答えて

6

No. しかし、コンストラクタはしばしばファクトリメソッドで置き換えられるため、抽象ファクトリメソッドやビルダーパターンのような他のパターンを実装できます。

+1

ファクトリメソッドはここでは良い提案です。 – vikingsteve

4

いいえありません。

反映を利用するユニットテストフレームワークを構築して、正しいコンストラクタが存在することを確認することができます。

+0

ありがとう、私は、クラスによって実装されたインターフェイスにnewInstanceという名前のメソッドを実装する方がよいでしょう。 – yonutix

3

あなたはabstractコンストラクタを作成しますが、ここであなたが行うことができます回避策だことはできません。

は、ユーザーが実装するすべてのコンストラクタでabstractクラスを実装します。それぞれに、このクラスのabstractメソッドを参照する1つのステートメントがあります。実装はサブクラスにあります。このようにして、抽象メソッドの実装を介して、本体をコンストラクターに提供するようにユーザーを強制します。たとえば、次のように実装で

public abstract class MyAbstractClass { 
    public MyAbstractClass(int param) { 
     method1(param); 
    } 

    public MyAbstractClass(int param, int anotherParam) { 
     method2(param, anotherParam); 
    } 

    protected abstract void method1(int param); 

    protected abstract void method2(int param, int anotherParam); 
} 

、あなたはは、2つのコンストラクタの遺体を表すことができ、これらの2つのメソッドの実装を提供するを余儀なくされます:

public class MyClass extends MyAbstractClass { 
    public MyClass(int param) { 
     super(param); 
    } 

    public MyClass(int param, int anotherParam) { 
     super(param, anotherParam); 
    } 

    public void method1(int param) { 
     //do something with the parameter 
    } 

    public void method2(int param, int anotherParam) { 
     //do something with the parameters 
    } 
} 
+0

素敵な回答ありがとう – yonutix

+0

ようこそ。 –

+0

しかし、単純なファクトリメソッドがより良いアイデアであることが判明しました。 – yonutix