2017-05-03 1 views
0

ちょうど私がモデルを作成しているときに私はプライベートコンストラクタを作成することができました ...おそらくJavaまたはeclipseのバグは確かに確認する必要があります。私はそれが不可能であることを知っていますが、自分で試してみてください。プライベートコンストラクタからオブジェクトを作成する - eclipse/java bug?

任意のモデルを作成します。

//case1 
public class Main { 

private Main(){} 
public Main(Double...doubles){} 
} 

通常、オブジェクトを作成できませんでした。メインm = new Main(); uはそのようなモデルを作成する際しかし:

//case2 
public class Main { 

private Main(){} 
public Main(Double [] doubles){} 
} 

をあなたはできを作成し、オブジェクトになっているメインメートル=新しいメイン();

それはどういうことでしょうか?どんな説明にも感謝します。

のJava:構築1.8.0_131-B11

のEclipse:バージョン:Neon.3リリース(4.6.3)

+0

可能な複製(http://stackoverflow.com/questions/2816123/can-a-constructor-in-java [Javaでコンストラクタはprivateにすることはできますか?] -be-private) –

+0

「おそらくJava [sic]またはeclipse [sic]バグ」 - うーん、それは決してそうでないだろう。あなたのデバッグツールキットからその推測を永久に取り除くこともできます。それはちょうど希望的な魔法の思考です。 –

答えて

3

これはバグではありません。ケース2では、実際にプライベートコンストラクタを作成しています。つまり、argsというデフォルトのコンストラクタを使用してMainのオブジェクトをインスタンス化することはできません。定義されているのと同じクラスのプライベートコンストラクタを使用してオブジェクトを作成することができます。

public class Main { 

    private Main() { 
    } 

    public Main(Double[] doubles) { 
    } 

    public void testPrivateConstructor() { 
     Main mainObjectInsideTheSameClass = new Main(); 
    } 
} 

ケース1の2番目のコンストラクタはpublicであり、可変長の引数をとります。したがって、Main m = new Main()を使用してオブジェクトを作成すると、実際には2番目のパブリックコンストラクタが使用されており、ゼロ引数を渡しています。

ケース2の具体的な使用例の1つは、Javaでシングルトンパターンです。
参照:

+0

私はそれについてすべてのことができます... urselfを試してください – Michael

+0

'Main m = new Main();'でオブジェクトを作成することはできません。あなたは他のコンストラクタを使用し、 'Double'配列を渡します。 –

+0

試しましたか?私が書いたようなモデルを作成し、 'public static void main(String [] args){'を使って別のクラスを作成し、自分自身を試してみてください... – Michael

0

そのことになってみましょう。 Javaでプライベートコンストラクタを作成することは許可されています。これを参照してくださいlink

0

(たとえそのメソッドが静的であっても)そのクラスメソッドのいずれかでプライベートコンストラクタを使用できます。

testAの作成は、TestA(Double... d)コンストラクタを使用します。 Double...可変引数 0または複数の引数を渡すことができます。

public class Main 
{ 
    private Main() 
    { 
     System.out.println("Main1"); 
    } 

    public Main(Double[] d) 
    { 
     System.out.println("Main1 " + (Arrays.toString(d))); 
    } 

    public static void main(String[] args) 
    { 
     TestA testA = new TestA(); //match to TestA(Double... d) with zero args 
//  TestB testB = new TestB(); //ERROR don't match to TestB(Double[] d) 
     Main main = new Main(); //you can use private constructors in class 
    } 
} 

class TestA 
{ 
    private TestA() 
    { 
     System.out.println("TestA1"); 
    } 

    public TestA(Double... d) 
    { 
     System.out.println("TestB2 " + (Arrays.toString(d))); 
    } 
} 

class TestB 
{ 
    private TestB() 
    { 
     System.out.println("TestB1"); 
    } 

    public TestB(Double[] d) 
    { 
     System.out.println("TestB2 " + (Arrays.toString(d))); 
    } 
} 

アウト:の

TestA2 [] 
Main1 
関連する問題