Java 如何创建具有不同数量参数的对象?

Java 如何创建具有不同数量参数的对象?,java,Java,我的问题是,如果我想创建一个表示联系人列表中某个人的对象,该怎么办。 用户必须输入姓氏,否则程序将无法运行。 此外,用户可以输入名字、地址、电话号码等,但这些都不是必需的。 那么我该如何应对这些问题呢? 我可以创建大量具有不同参数组合的构造函数,但我认为这不是正确的解决方案 你们能帮帮我吗?你们听说过二传手吗 我曾经在一个项目中遇到过这个问题,我是这样想的: 必须填充值:通过构造函数传递它们 可选值:使用setter传递它们 该类人员的代码示例: public class person

我的问题是,如果我想创建一个表示联系人列表中某个人的对象,该怎么办。 用户必须输入姓氏,否则程序将无法运行。 此外,用户可以输入名字、地址、电话号码等,但这些都不是必需的。 那么我该如何应对这些问题呢? 我可以创建大量具有不同参数组合的构造函数,但我认为这不是正确的解决方案


你们能帮帮我吗?

你们听说过二传手吗

我曾经在一个项目中遇到过这个问题,我是这样想的:

  • 必须填充值:通过构造函数传递它们
  • 可选值:使用setter传递它们
  • 该类人员的代码示例:

        public class person {
    
        private String lastName;
        private String firstName;
        private String address;
        private String phoneNumber;
    
        //lastName is mandatory you should pass when you create your object
        public person(String lastName) {
            this.lastName = lastName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        //This is optional you can pass it using this setter
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getAddress() {
            return address;
        }
    
        //This is optional you can pass it using this setter
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String getPhoneNumber() {
            return phoneNumber;
        }
    
        //This is optional you can pass it using this setter
        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }
    
        }
    
    主类的代码示例

    public class yourclass {
        public static void main(String[] args) {
            String lastname="fooer"; //choose how you want to intercept the input if you are building a GUI app, tell me I would help you with JavaFx or Swing code.
            String firstname="foo" //let's say this is the only optional to pass
            person newperson = new person(lastname);
            if (firstname.isEmpty()==false)
                newperson.setFirstName(firstname);
    
        }
    }
    

    你听说过二传手吗

    我曾经在一个项目中遇到过这个问题,我是这样想的:

  • 必须填充值:通过构造函数传递它们
  • 可选值:使用setter传递它们
  • 该类人员的代码示例:

        public class person {
    
        private String lastName;
        private String firstName;
        private String address;
        private String phoneNumber;
    
        //lastName is mandatory you should pass when you create your object
        public person(String lastName) {
            this.lastName = lastName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        //This is optional you can pass it using this setter
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getAddress() {
            return address;
        }
    
        //This is optional you can pass it using this setter
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String getPhoneNumber() {
            return phoneNumber;
        }
    
        //This is optional you can pass it using this setter
        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }
    
        }
    
    主类的代码示例

    public class yourclass {
        public static void main(String[] args) {
            String lastname="fooer"; //choose how you want to intercept the input if you are building a GUI app, tell me I would help you with JavaFx or Swing code.
            String firstname="foo" //let's say this is the only optional to pass
            person newperson = new person(lastname);
            if (firstname.isEmpty()==false)
                newperson.setFirstName(firstname);
    
        }
    }
    

    简单方法:将构造函数与必填字段一起使用,并提供setter来为其他字段赋值。

    如果需要不变性,则更复杂的方法是:使用生成器构建Person实例。

    Builder
    应该是
    Person
    的静态嵌套类,该类提供了构建
    Builder
    对象的方法,
    Builder
    类提供了设置
    Builder
    对象值的方法。
    每个方法都返回当前的
    Builder
    实例,但
    build()
    实例创建并返回已创建的
    Person
    对象。

    下面是一个示例类:

    public class Person {
    
        private String name;
        private String address;
        private String phone;
    
        // private constructor
        private Person() {
        }
    
        public static class Builder {
    
          private String name;
          private String address;
          private String phone;
    
          // mandatory fields
          public Builder(String name) {
            this.name = name;
          }
    
          public Builder address(String address) {
            this.address = address;
            return this;
          }
    
          public Builder phone(String phone) {
            this.phone = phone;
            return this;
          }
    
          public Person build() {
            Person p = new Person();
            p.name = name;
            p.address = address;
            p.phone = phone;
            return p;
          }
       }
    
    }
    
    您可以这样使用它:

    Person person = new Person.Builder("myName").address("myAddress").build();
    


    简单方法:将构造函数与必填字段一起使用,并提供setter来为其他字段赋值。

    如果需要不变性,则更复杂的方法是:使用生成器构建Person实例。

    Builder
    应该是
    Person
    的静态嵌套类,该类提供了构建
    Builder
    对象的方法,
    Builder
    类提供了设置
    Builder
    对象值的方法。
    每个方法都返回当前的
    Builder
    实例,但
    build()
    实例创建并返回已创建的
    Person
    对象。

    下面是一个示例类:

    public class Person {
    
        private String name;
        private String address;
        private String phone;
    
        // private constructor
        private Person() {
        }
    
        public static class Builder {
    
          private String name;
          private String address;
          private String phone;
    
          // mandatory fields
          public Builder(String name) {
            this.name = name;
          }
    
          public Builder address(String address) {
            this.address = address;
            return this;
          }
    
          public Builder phone(String phone) {
            this.phone = phone;
            return this;
          }
    
          public Person build() {
            Person p = new Person();
            p.name = name;
            p.address = address;
            p.phone = phone;
            return p;
          }
       }
    
    }
    
    您可以这样使用它:

    Person person = new Person.Builder("myName").address("myAddress").build();
    


    你不想尝试的是?如果您的字段数量较少(因此需要较少的构造函数),那么这很容易实现 就好的设计而言,你可以考虑以下几点:


    你不想尝试的是?如果您的字段数量较少(因此需要较少的构造函数),那么这很容易实现 就好的设计而言,你可以考虑以下几点:


    您可以使用不同的模式:

    • JavaBeans(getter和setter)
    • 伸缩构造函数(具有不同数量的参数)
    • 构建器模式
    但它们中的任何一个都不能保证用户的输入

    这主要取决于您的UI,以及可能从UI获得的数据

    若UI可能会向您发送null或空字符串,那个么您应该从必填字段处理它们,因为这是您的业务逻辑,无论您使用的是哪种模式

    我们要求您从来自UI的DTOPerson构建新的Person:

    public Person register(Person personDTO) {
        validatePerson(personDTO);
        Person person = new Person(personDTO.getName(), personDTO.getSurname());
        // for not mandatory fields
        person.setAddress(personDTO.getAddress());
    
        // ...
    }
    
    public void validatePerson(Person person) {
        Optional.ofNullable(person.getName()).orElseThrow(() -> 
            new IllegalArgumentException("Name is required!")
        );
    
        Optional.ofNullable(person.getSurname()).orElseThrow(() ->
                new IllegalArgumentException("Surname is required!")
        );
    }
    

    您可以使用不同的模式:

    • JavaBeans(getter和setter)
    • 伸缩构造函数(具有不同数量的参数)
    • 构建器模式
    但它们中的任何一个都不能保证用户的输入

    这主要取决于您的UI,以及可能从UI获得的数据

    若UI可能会向您发送null或空字符串,那个么您应该从必填字段处理它们,因为这是您的业务逻辑,无论您使用的是哪种模式

    我们要求您从来自UI的DTOPerson构建新的Person:

    public Person register(Person personDTO) {
        validatePerson(personDTO);
        Person person = new Person(personDTO.getName(), personDTO.getSurname());
        // for not mandatory fields
        person.setAddress(personDTO.getAddress());
    
        // ...
    }
    
    public void validatePerson(Person person) {
        Optional.ofNullable(person.getName()).orElseThrow(() -> 
            new IllegalArgumentException("Name is required!")
        );
    
        Optional.ofNullable(person.getSurname()).orElseThrow(() ->
                new IllegalArgumentException("Surname is required!")
        );
    }
    


    我会将强制值放在构造函数中,并使用setter设置可选值。我会将强制值放在构造函数中,并使用setter设置可选值。好的,但是如果有人没有为setMethod传递值,该怎么办?因为除了姓氏以外的一切都是不必要的?如果有必要,如果有人没有填写他们,应用程序仍然以正确的方式运行,对吗?set方法在那里,你使用它或没有问题,但是构造函数你必须传递正确的参数来创建对象。你有我的示例代码吗?每次我没有在setMethod中传递值时,我就会得到一个errorDone,你想让我添加更多代码,说明你应该如何在main中调用它吗?现在有意义了吗?好的,但是如果有人没有为setMethod传递值呢?因为除了姓氏以外的一切都是不必要的?如果有必要,如果有人没有填写他们,应用程序仍然以正确的方式运行,对吗?set方法在那里,你使用它或没有问题,但是构造函数你必须传递正确的参数来创建对象。你有我的示例代码吗?每次我没有在我的setMethod中传递一个值,我就得到一个errorDone,你想让我添加更多的代码,说明你应该如何在main中调用它吗?现在有意义了吗?生成器模式与不变性有什么关系?@beatng你不需要为
    Person
    提供setter,并且对象是在一个调用(
    build()
    )中创建的。当然,你不必这么做。但是“如果需要不变性”听起来有点混乱。应用builder模式可以简单地将构造和表示分离;它不会影响相应类的(im)可变性。尽管如此,当您使用生成器作为构造obje的唯一方法时,+1表示建议该模式