2017-06-04 107 views
0

我的問題是如果我想創建一個代表聯繫人列表中的人的對象。 用戶必須輸入姓氏,如果不是,程序將不起作用。 除此之外,用戶可以輸入名字,地址,電話號碼等,但這些不是必需的。 那麼我該如何解決這些問題? 我可以用不同的參數組合創建大量的構造函數,但我不認爲這是正確的解決方案。如何使用不同數量的參數創建對象?

你們能幫我嗎?

+1

我會放置強制值在構造和使用設置制定者可選的。 –

回答

0

您是否聽說過安裝人員?

我曾經在一個項目有這個問題,我認爲它是這樣的:

  1. 的必須填寫值:通過構造函數傳遞它們
  2. 可選值:使用setter方法
通過他們

類人的代碼示例:主要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); 

    } 
} 
+0

沒關係,但如果有人沒有爲setMethod傳遞一個值會怎麼樣?因爲除姓以外的所有內容都沒有必要? –

+0

如果有必要如果有人不填充應用程序劇照功能正確的方式嗎? set方法在那裏你使用它或不是沒問題,但構造函數你必須傳遞正確的參數來創建對象。 –

+0

你有我的示例代碼嗎?每次我沒有在我的setMethod中傳遞一個值時,我得到一個錯誤 –

3

簡單的方法:使用構造強制性領域,並提供製定者看重等領域。

如果需要不變性,則需要更復雜的方法:使用構建器構建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(); 
+0

生成器模式如何與不變性相關? – beatngu13

+0

@beatng您不需要爲'Person'提供setter,並且該對象是在一次調用('build()')中創建的。 – davidxxx

+0

當然,你不需要。但是「如果需要不變性」聽起來有點混亂。應用建設者模式只是分離建設和表示;它不會影響相應類的(im)可變性。儘管如此,+1建議的模式。 – beatngu13

0

你不想要嘗試什麼是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); 
     } 

    } 

} 
0

您可以使用不同的模式:

  • 的JavaBeans(getter和setter)
  • 伸縮構造(具有不同數量的參數)
  • Builder模式

但它們中的不會保證用戶輸入的內容。

它主要取決於您的用戶界面,以及可能從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!") 
    ); 
} 
相關問題