2016-03-22 9 views
0

パラメーターなしのコンストラクターを必須にする方法はありますか?Java - パラメーターなしのコンストラクターを作成する必要があります。

私はこの例がうまくいくと思いました。あなたは、クラスAとBがあります。

public class A { 
    public A() { 
     //do something 
    } 
} 

public class B extends A { 
    public B(int number) { 
     //do something with number 
    } 
} 

をしかし、クラスBは、パラメータなしのコンストラクタを持っていないので、あなたは、B b = new B();を呼び出すことはできません。それは番号を持つコンストラクタしか持っていません。

私はJavaでのリフレクションで遊んでいて、クラス(class.newInstance())からオブジェクトをインスタンス化したかったのです。しかし、このようにインスタンス化するには、パラメータを持たないコンストラクタが必要です。

私は今、反射について尋ねていません。私は、argのコンストラクタを強制的に作成する方法や、クラスがコンストラクタについて言及していることを確認する方法があるかどうかを知りたいだけです。あなたには、いくつかの合理的なデフォルトにnumberを設定(またはJavaを0に設定してみましょう)Bで引数なしのコンストラクタを提供している場合、これが行うことができる

+5

いいえ、このような方法はありません。このような方法はありません。 – Tunaki

+0

すべてのクラスを反映するテストを追加して、0のargコンストラクタを持たないクラスを見つけたら失敗する可能性があります。 – beresfordt

+0

コンストラクタを追加するだけです。あなたが何を求めているのかは分かりません。 "パラメータのないコンストラクタがあるはずです"と言うクラスを修正しようとしたら、代わりにそのクラスを提供するように変更することができます。 –

答えて

1

私が正しく質問を理解していれば、あなたはそれが必須のすべてのクラスがゼロのarg /デフォルトコンストラクタを持ってできるようにするためにしたいです。 Reflections library

@Test 
public void ensureAllClassesInPackageTempHaveAZeroArgConstructor() throws Exception { 
    List<ClassLoader> classLoadersList = new LinkedList<>(); 
    classLoadersList.add(ClasspathHelper.contextClassLoader()); 
    classLoadersList.add(ClasspathHelper.staticClassLoader()); 

    Reflections reflections = new Reflections(new ConfigurationBuilder() 
      .setScanners(new SubTypesScanner(false), new ResourcesScanner()) 
      .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) 
      .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("temp")))); 

    for (Class<?> clazz : reflections.getSubTypesOf(Object.class)) { 
     boolean hasZeroArgConstructor = Arrays.asList(clazz.getConstructors()).stream().anyMatch(c -> c.getParameterCount() == 0); 
     if (! hasZeroArgConstructor) { 
      Assert.fail(String.format("%s doesn't have a zero arg constructor", clazz.getCanonicalName())); 
     } 
    } 
} 
1

唯一方法があります。

public class B extends A { 
    public B(int number) { 
     //do something with number 
    } 

    public B() { 
     // set number to a sane default 
    } 
} 

これ以外に、あなたが求めていることを達成する他の方法はありません。引数を持たないコンストラクタのいずれかの形式を記述すると、Javaの暗黙の引数なしコンストラクタは考慮されなくなります。

0

私はあなたがこのような状況でのオーバーロードコンストラクタを使用することができると思う:

public class A { 
    public A() { 
     //do something 
    } 
} 

public class B extends A { 
    public B(int number) { 
     //do something with number 
    } 

    public B() { 
     //do something with number 
    } 
} 
+0

私はコンストラクタをオーバーロードすることができますが、私はする必要はありません。私は何かをしたかったので、クラスにargsのないコンストラクタを定義する必要があるか、または継承されたクラスから存在することになります。 – Pyro

関連する問題