避免由于相同参数类型导致构造函数冲突的最佳实践?

时间:2014-02-26 21:54:52

标签: java constructor

虽然它仅在极少数情况下发生,但我有时需要两个具有相同参数类型的构造函数,当然每个构造函数具有不同的参数角色。这是一个例子:

public class MyClass {
    public MyClass(String title, String content) {
        // ...
    }

    public MyClass(String title, String link) {
        // ...
    }
}

我很想知道你们在这种情况下做了什么?

  1. 尽可能交换一个构造函数的参数顺序(嗯,不是 在我的例子中)

  2. 放弃战斗并在构造函数

  3. 之后调用setter
  4. 从未发生过,因为它应该通过设计来管理,比如多态/继承

  5. 使用设计模式

  6. 添加一个虚拟的未使用参数以使它们唯一(不,真的吗?)

  7. ...


  8. 编辑:不要自我:我刚刚在java.util.HashSet中发现了一件可怕的事情:(对于JDK类来说非常令人惊讶,即使它的包是私有的)

    /* ......
     * @param dummy  Ignored (distinguishes this constructor from other int, float constructor.)
     * ......
     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        ...
    }
    

4 个答案:

答案 0 :(得分:3)

在这种情况下,您可以添加回答类实例的静态方法。如果您有类似类型的参数,则可以更改名称。为了强制使用这些方法,你可以使用一个声明为private的单个无参数构造函数。

答案 1 :(得分:3)

使用Builder Pattern。名为Builder的嵌套类接受设置,一次接受一个setter方法,build()方法返回实际的MyClass对象。

public class MyClass {
   private String title;
   private String content;
   private String link;
   public static class Builder {
      private String title;
      private String content;
      private String link;

      public void setTitle(String title) { this.title = title; }
      public void setContent(String content) { this.content = content; }
      public void setLink(String link) { this.link = link; }
      public MyClass build() {
         return new MyClass(this);
      }
   }

   private MyClass(Builder builder) {
      // Validate here.
      if (builder.title == null)
         throw new IllegalArgumentException("Title is required!");
      this.title = builder.title;
      this.content = builder.content;
      this.link = builder.link;
   }
}

这种方式参数不会混淆,并且构造函数不会因所有情况而成倍增加。

答案 2 :(得分:0)

你可能会做这样的事情

public class Link{ /* constructor from string */ }
public class Content{ /* constructor from string */ }

然后单独使用Link和Content类重载MyClass构造函数

答案 3 :(得分:0)

您可以使用带有私有构造函数的命名工厂方法列表:调用者只知道方法的语义,隐藏它们的实现。稍后,如果您愿意,可以在不更改调用者的情况下重构代码。

我发现这个解决方案更适合您的目的,恕我直言,建设者模式是一个过度设计的解决方案(在您的情况下)。

public class MyClass {
    private MyClass(String title, String content, String link) {
        // ...
    }

    public static MyClass buildWithLink (String title, String link) {
        return new MyClass(title, null, link);
    }


    public static MyClass buildWithContent (String title, String content) {
        return new MyClass(title, content, null);
    }
}