我的問題是如果我想創建一個代表聯繫人列表中的人的對象。 用戶必須輸入姓氏,如果不是,程序將不起作用。 除此之外,用戶可以輸入名字,地址,電話號碼等,但這些不是必需的。 那麼我該如何解決這些問題? 我可以用不同的參數組合創建大量的構造函數,但我不認爲這是正確的解決方案。如何使用不同數量的參數創建對象?
你們能幫我嗎?
我的問題是如果我想創建一個代表聯繫人列表中的人的對象。 用戶必須輸入姓氏,如果不是,程序將不起作用。 除此之外,用戶可以輸入名字,地址,電話號碼等,但這些不是必需的。 那麼我該如何解決這些問題? 我可以用不同的參數組合創建大量的構造函數,但我不認爲這是正確的解決方案。如何使用不同數量的參數創建對象?
你們能幫我嗎?
您是否聽說過安裝人員?
我曾經在一個項目有這個問題,我認爲它是這樣的:
類人的代碼示例:主要CL的
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);
}
}
沒關係,但如果有人沒有爲setMethod傳遞一個值會怎麼樣?因爲除姓以外的所有內容都沒有必要? –
如果有必要如果有人不填充應用程序劇照功能正確的方式嗎? set方法在那裏你使用它或不是沒問題,但構造函數你必須傳遞正確的參數來創建對象。 –
你有我的示例代碼嗎?每次我沒有在我的setMethod中傳遞一個值時,我得到一個錯誤 –
簡單的方法:使用構造強制性領域,並提供製定者看重等領域。
如果需要不變性,則需要更復雜的方法:使用構建器構建Person實例。
Builder
應該是一個靜態嵌套類的Person
,提供了一個方法來建立一個Builder
對象和Builder
類提供方法來設置Builder
對象的值。
此方法的每一個都會返回當前的Builder
實例,但會返回創建並返回Person
對象的build()
。
下面是一個簡單類:
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();
或
Person person = new Person.Builder("myName").address("myAddress").phone("my phone").build();
你不想要嘗試什麼是telescoping constructor pattern?這是很容易實現,如果你有場(因而需要較小的構造函數) 的較小沒有好的設計方面,可以考慮以下幾點: Builder Design pattern
public class Computer {
//required parameters
private String HDD;
private String RAM;
//optional parameters
private boolean isGraphicsCardEnabled;
private boolean isBluetoothEnabled;
public String getHDD() {
return HDD;
}
public String getRAM() {
return RAM;
}
public boolean isGraphicsCardEnabled() {
return isGraphicsCardEnabled;
}
public boolean isBluetoothEnabled() {
return isBluetoothEnabled;
}
private Computer(ComputerBuilder builder) {
this.HDD=builder.HDD;
this.RAM=builder.RAM;
this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled;
this.isBluetoothEnabled=builder.isBluetoothEnabled;
}
//Builder Class
public static class ComputerBuilder{
// required parameters
private String HDD;
private String RAM;
// optional parameters
private boolean isGraphicsCardEnabled;
private boolean isBluetoothEnabled;
public ComputerBuilder(String hdd, String ram){
this.HDD=hdd;
this.RAM=ram;
}
public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {
this.isGraphicsCardEnabled = isGraphicsCardEnabled;
return this;
}
public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {
this.isBluetoothEnabled = isBluetoothEnabled;
return this;
}
public Computer build(){
return new Computer(this);
}
}
}
您可以使用不同的模式:
但它們中的不會保證用戶輸入的內容。
它主要取決於您的用戶界面,以及可能從UI獲得的數據。
如果UI有可能發送空值或爲空字符串,那麼您應該將它們處理爲必填字段,因爲這是您的業務邏輯,無論您使用的是哪種模式。
讓我們薩雷你需要從DTOPerson這是建立新的人從UI傳來:
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!")
);
}
我會放置強制值在構造和使用設置制定者可選的。 –