从私有构造函数创建对象 - eclipse / java bug?

时间:2017-05-03 22:04:58

标签: java eclipse

刚刚注意到我在创建模型时我能够创建一个私有构造函数 ...可能java或eclipse错误只需要确认。我知道这有点不可能,但试试自己。

创建任何模型即

//case1
public class Main {

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

通常你不能创建一个对象 Main m = new Main(); 但是当你创建一个这样的模型时:

//case2
public class Main {

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

无法创建并对象 Main m = new Main();

它的假设是什么?将不胜感激任何解释。

Java:build 1.8.0_131-b11

Eclipse:版本:Neon.3发布(4.6.3)

3 个答案:

答案 0 :(得分:3)

这不是一个错误。在案例2中,您实际上是在创建一个私有构造函数,这意味着您无法使用不带Main的默认构造函数来实例化args的对象。您只能使用私有构造函数在定义它的同一个类中构造一个对象。

public class Main {

     private Main() {
     }

     public Main(Double[] doubles) {
     }

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

案例1中的第二个构造函数是公共的,它需要可变数量的参数。因此,当您使用Main m = new Main()创建对象时,您实际上正在使用第二个公共构造函数,并且您传递零参数。

案例2的具体用例之一是Java中的 singleton pattern 请参阅:Can a constructor in Java be private?

答案 1 :(得分:0)

它应该是怎样的。您可以使用Java创建私有构造函数。请参阅此link

答案 2 :(得分:0)

您可以在任何类方法中使用私有构造函数(即使该方法是静态的)。

创建testA使用TestA(Double... d)构造函数。 Double... varargs 允许传递零或多个参数。

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