【问题标题】:How to make constructor that takes in 2 if there are 2 parameters, or 3 if there are 3如果有 2 个参数,如何制作接受 2 个参数的构造函数,如果有 3 个参数,如何制作接受 3 个参数的构造函数
【发布时间】:2015-10-28 17:19:32
【问题描述】:

Java 新手...

我有一个名称类:

private String firstName;
private String middleInitial;
private String lastName;

作为它的实例变量。

如果我有某些数据只有名字和姓氏,没有中间名,我将如何制作构造函数以便它只需要两个参数而不是三个参数?

【问题讨论】:

    标签: java constructor


    【解决方案1】:

    你只需编写一个带有两个参数的构造函数和一个带有三个参数的构造函数

    public YourClass(String firstName, String lastName) {
       ...
    }
    
    public YourClass(String firstName, String middleInitial, String lastName) {
        ...
    }
    

    然后调用者可以根据需要选择使用适当的构造函数。

    【讨论】:

      【解决方案2】:

      嗯,有两个选择:

      • 只要有一个带有三个参数的构造函数,并使用 null 或 middleInitial 的空字符串调用它
      • 重载构造函数,可能会调用另一个构造函数。

      作为后者的例子,使用一个空字符串作为默认的中间声母:

      public Person(String firstName, String middleInitial, String lastName)
      {
          this.firstName = firstName;
          this.middleInitial = middleInitial;
          this.lastName = lastName;
      }
      
      
      public Person(String firstName, String lastName)
      {
          this(firstName, "", lastName);
      }
      

      但是,编译器需要知道您从调用站点调用的是哪一个。所以你可以这样做:

      new Person("Jon", "L", "Skeet");
      

      或

      new Person("Jon", "Skeet");
      

      ...但你不能这样做:

      // Invalid
      new Person(firstName, gotMiddleInitial ? middleInitial : ???, lastName);
      

      并期望编译器决定使用“双名”变体。

      【讨论】:

      • 提示:我认为当您提供getFullName() 方法时,您会获得一些额外的支持。
      • +1 用于建议 2 参数构造函数调用 3 参数构造函数。
      • 定义和记录规范构造函数是一个非常好的实践。使子类化更易于理解,并将初始化逻辑集中在一个地方。 +1 回答和@Brian
      • “嗯,两个选项” -> 还有构建器模式.. :)
      【解决方案3】:

      在 Java 中,构造函数不能有默认参数。您唯一的选择是编写两个构造函数。幸运的是,Java 确实允许您从其他构造函数调用构造函数。你可以这样做:

      public class MyClass {
          private String firstName;
          private String middleInitial;
          private String lastName;
      
          public MyClass(String firstName, String middleInitial, String lastName) {
              this.firstName = firstName;
              this.middleInitial = middleInitial;
              this.lastName = lastName;
          }
      
          public MyClass(String firstName, String lastName) {
              this(firstName, "", lastName);
          }
      
          ...
      }
      

      【讨论】:

        【解决方案4】:
        public Class Name{
        private String first;
        private String middle;
        private String last;
        
        public Name(String first, String middle, String last){
        this.first = first;
        this.middle = middle;
        this.last = last;
        }
        
        public Name(String first, String last){
        this.first = first;
        this.last = last;
        }
        
        }
        

        【讨论】:

        • 这行不通。后两个构造函数具有相同的签名(Name(String, String)),所以它是模棱两可的。
        • @jpm - 谢谢。如果你赶时间会发生什么。删除了第三个。
        【解决方案5】:

        你可以使用两个构造函数:

        public Person(String firstName, String lastName)
        {
            this(firstName, null, lastName);
        }
        
        public Person(String firstName, String middleInitial, String lastName)
        {
            this.firstName     = firstName;
            this.middleInitial = middleInitial;
            this.lastName =    = lastName;
        }
        

        【讨论】:

          【解决方案6】:

          定义2个构造函数,一个有2个参数,一个有3个参数。

          【讨论】:

            【解决方案7】:

            你可以写两个构造函数。

            public Person( String firstName, String lastName, String middleName ) { ... }
            
            public Person( String firstName, String lastName ) { ... }
            

            【讨论】:

              【解决方案8】:
              public void myBike(String name, String color)
              {
                    System.out.println("My bike's name is " + name + " and is " + color + ".");
              }
              
              public void myBike(String name, String color, float height)
              {
                    System.out.println("My bike's name is " + name + " and is " + color + ".");
                    System.out.println("My bike is also " + height + " inches tall.");
              }
              

              【讨论】:

                【解决方案9】:

                建造者模式...

                class Name {
                
                            Builder builder;
                
                
                            public String getSurname() {
                                return builder.surname;
                            }
                
                            // getter...
                
                
                            public Name(Builder builder) {
                                this.builder = builder;
                            }
                
                
                            class Builder {
                
                                String surname = "";
                                String middleName = "";
                                String name = "";
                
                
                                Builder surname(String surname) {
                                    this.surname = surname;
                                    return this;
                                }
                
                
                                Builder middleName(String middleName) {
                                    this.middleName = middleName;
                                    return this;
                                }
                
                
                                Builder name(String name) {
                                    this.name = name;
                                    return this;
                                }
                
                
                                Name build() {
                                    return new Name(this);
                                }
                
                            }
                        }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-11-28
                  • 1970-01-01
                  • 2015-02-03
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-01-16
                  • 2015-09-04
                  • 1970-01-01
                  相关资源
                  最近更新 更多