2016-07-11 30 views
0

Manchmal habe ich das Problem mit einem PMD-Check über meinen Code. Ich meine - zu viel String-Parameter:Zu viele String-Parameter in Methode

„Anstatt eine Menge von String-Argumente verwenden, sollten Sie für diese Werte ein Containerobjekt mit“

fe:

public void printPersons (final String name, final String surname, final String day, final String car, final String city, final String petName) 
{ 

} 

Wie Sie können diese Situation vermeiden in Deinen Projekten?

+1

Durch "ein Containerobjekt für diese Werte verwenden". Sie sollten ein "Personen" -Objekt übergeben. Oder Sie sollten einfach 'to_string()' für 'Person' schreiben und keine' printPersons() 'Methode haben. – Tyler

+0

Ja, aber wie wird dieser Container im oberen Beispiel aussehen? – profiler

+1

Ich schlage vor, Sie lernen über Klassen. http://www.tutorialspoint.com/java/java_object_classes.htm – Tyler

Antwort

0

Sie können eine einfache Klasse definieren, die alle diese Felder einkapselt und diese an Ihre ursprüngliche Methode übergibt.

public class Person { 
    private final String name; 
    private final String surname; 
    private final String day; 
    private final String car; 
    private final String city; 
    private final String petName; 

    public Person(final String name, final String surname, final String day, final String car, final String city, final String petName) { 
    this.name = name; 
    this.surname = surname; 
    this.day = day; 
    this.car = car; 
    this.city = city; 
    this.petName = petName; 
    } 

    public String getName() { 
    return this.name; 
    } 

    public String getSurname() { 
    return this.surname; 
    } 

    public String getDay() { 
    return this.day; 
    } 

    public String getCar() { 
    return this.car; 
    } 

    public String getCity() { 
    return this.city; 
    } 

    public String getPetName() { 
    return this.petName; 
    } 
} 

Und Ihr Methodenaufruf wird jetzt:

public void printPersons(Person person) {} 
+3

Vielleicht haben Sie gerade das Problem mit den vielen String-Argumenten an den Konstruktor verschoben ?! Ersetzen Sie den Konstruktor mit einem benutzerfreundlichen Builder wäre eine gute Lösung, denke ich. – martinhh

+2

Viele Argumente zu einem Konstruktor zu haben ist nicht wirklich eine große Sache imo. Es ist viel schlimmer, wenn es eine öffentliche Methode ist, weil der Benutzer dieser Methode unmöglich vorhersehen kann, was passieren wird, da er so viele Argumente liefert. –

-1

Für mich ist es außer Frage, dass ein Container-Objekt (Person) sollte hier verwendet werden. Um die Konstruktion von Personeninstanzen zu erleichtern, wird ein innerer Klassen-PersonBuilder verwendet, kein Konstruktor oder Setter wird verfügbar gemacht.

public final class Person { 
    private final String name; 
    private final String surname; 
    private final String day; 
    private final String car; 

    // all the other attributes omitted 

    public static void main(final String[] args) { 
     // usage example 
     Person person = Person.builder().name("Name").surname("Surname") 
       .car("Tesla").day("Friday").build(); 

     person.toString(); 

    } 

    // private constructor, only used by the PersonBuilder 
    private Person(final PersonBuilder pb) { 
     this.name = pb.name; 
     this.surname = pb.surname; 
     this.day = pb.day; 
     this.car = pb.car; 
    } 

    public static PersonBuilder builder() { 
     return new PersonBuilder(); 
    } 

    public String toString() { 

     return "return a nicely formatted String for printing, logging etc."; 
    } 

    /** 
    * expose a nice, fluent API to construct Persons. 
    */ 
    public static final class PersonBuilder { 
     private String name; 
     private String surname; 
     private String day; 
     private String car; 

     // use the static method Person.builder() to get an instance. 
     private PersonBuilder() { 
     } 

     public PersonBuilder surname(final String surname) { 
      this.surname = surname; 
      return this; 
     } 

     public PersonBuilder name(final String name) { 
      this.name = name; 
      return this; 
     } 

     public PersonBuilder day(final String day) { 
      this.day = day; 
      return this; 
     } 

     public PersonBuilder car(final String car) { 
      this.car = car; 
      return this; 
     } 

     public Person build() { 
      return new Person(this); 
     } 
    } 

    public String getName() { 
     return name; 
    } 

    public String getSurname() { 
     return surname; 
    } 

    public String getDay() { 
     return day; 
    } 

    public String getCar() { 
     return car; 
    } 
} 
+0

Vielen Dank für die Lösung. Manchmal habe ich das große Problem, die PMD-Nachricht vollständig zu verstehen. Persönlich bevorzuge ich das Erbauermuster. – profiler

+0

'PersonBuilder' sollte sich selbst an den' Person'-Konstruktor übergeben, um die lange Methodensignatur zu vermeiden, über die sich PMD beschwert. – jaco0646

+0

@ jaco0646 Sie haben vollkommen Recht, ich habe das jetzt geändert. Außerdem habe ich eine statische Methode in Person hinzugefügt, um einen PersonBuilder (Person.builder()) zu erhalten und den Konstruktor von PersonBuilder privat gemacht. – martinhh