The builder pattern and a large number of mandatory parameters

前端 未结 7 1972
甜味超标
甜味超标 2020-11-29 02:44

To date I use the following implementation of the builder pattern (as opposed to the implementation described here):

public class Widget {
    public static          


        
7条回答
  •  甜味超标
    2020-11-29 03:20

    My solution with anonymous class. Here is familyName is required parameter, and givenName is Optional. The main target if this solution is force the programmer who creating Person to set requires parameters (if he will not do it, Java will not compile).

    new Person(
        Person.parametersObject(new Person.RequiredParameters() {
          @Override
          public void setFamilyName() {
            this.familyName = "Jonson";
          }
        })
        .setGivenName("John")
    );
    

    Actually, the target is not reached completely: because I couldn't to force the programmer to write this.familyName = familyName;, but he must to implement the setFamilyName. If programmer is not imbecile, he knows what he must to do in this method, but he can forget it because of fatigue.

    Implementation:

    public class Person {
    
      private String familyName;
      private String givenName;
    
    
      public Person(ParametersObject parametersObject) {
        parametersObject.initializeSpecifiedFields(this);
      }
    
      public static ParametersObject parametersObject(Person.RequiredParameters requiredParameters) {
        return new Person.ParametersObject(requiredParameters);
      }
    
    
      public String getFamilyName() {
        return familyName;
      }
      public Person setFamilyName(String familyName) {
        this.familyName = familyName;
        return this;
      }
    
      public String getGivenName() {
        return givenName;
      }
      public Person setGivenName(String givenName) {
        this.givenName = givenName;
        return this;
      }
    
    
      public static class ParametersObject {
    
        private String familyName;
        private String givenName;
    
        public ParametersObject(Person.RequiredParameters requiredParameters) {
          this.familyName = requiredParameters.familyName;
        }
    
        public void initializeSpecifiedFields(Person person) {
          person.familyName = this.familyName;
          person.givenName = this.givenName;
        }
    
        public ParametersObject setGivenName(String givenName) {
          this.givenName = givenName;
          return this;
        }
      }
    
      public static abstract class RequiredParameters {
        public String familyName;
        public abstract void setFamilyName();
      }
    }
    

提交回复
热议问题