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