【问题标题】:Java private constructor with parameters [duplicate]带参数的Java私有构造函数[重复]
【发布时间】:2019-03-02 08:19:46
【问题描述】:

新手问题。在java中使用带参数的私有构造函数是否有意义?既然私有构造函数只能在类中访问,那么任何参数都必须是该类的实例变量吗?

【问题讨论】:

  • 好的用例是singleton pattern
  • 它对构建器模式也很有用。如果构建器是主类的嵌套子类,它可以访问私有构造函数并使用它来创建对象。
  • 你忽略了一个类也可以有可以访问私有构造函数的静态方法。因此,实际值不限于实例变量。

标签: java parameters private-constructor


【解决方案1】:

是的,如果您打算在类本身的某个方法中使用该构造函数并将该方法公开给其他类,就像我们在 singleton 模式中所做的那样。一个简单的例子如下:

public class MySingleTon {    
    private static MySingleTon myObj;
    private String creator;
    private MySingleTon(String creator){
         this.creator = creator;
    }
    public static MySingleTon getInstance(String creator){
        if(myObj == null){
            myObj = new MySingleTon(creator);
        }
        return myObj;
    }
    public static void main(String a[]){
        MySingleTon st = MySingleTon.getInstance("DCR");
    } 
}

【讨论】:

  • 如果我们有一个 MyUtility 而不是 mySingleTon 会怎么样,比如 java 的 Math 类。那样的话还有意义吗?
  • 您的实际示例可以改进。您在getInstance("DCR") 中传递了一个参数,但如果您使用getInstance("RCD") 等新参数重新调用该方法,它将不会被重用。
【解决方案2】:

假设您有多个 public 构造函数,它们具有相同的变量来分配给特定字段,或者您需要执行相同的处理,您不想在每个公共构造函数中重复该操作,但您想委托这个任务交给共同的private 构造函数。
因此,在private 构造函数中定义参数来实现这一点是有意义的。

例如:

public class Foo{

   private int x;
   private int y;

   public Foo(int x, int y, StringBuilder name){
      this(x, y);
      // ... specific processing
   } 

   public Foo(int x, int y, String name){
      this(x, y);
      // ... specific processing
   } 

   private Foo(int x, int y){
      this.x = x;
      this.y = y;
   } 
}

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 2013-12-12
    • 1970-01-01
    • 2014-02-03
    • 2016-09-11
    • 2011-02-08
    • 2016-07-17
    • 2013-02-18
    • 2014-11-10
    相关资源
    最近更新 更多