2016-07-11 13 views
0

時々、自分のコードに関するPMDチェックに問題があります。私が意味する - あまりにも多くの文字列パラメータを:メソッドの文字列パラメータが多すぎます

「むしろ文字列引数の多くを使用するよりも、それらの値のためのコンテナオブジェクトを使用することを検討してください」

FE:

あなたはその状況を回避するにはどうすればよい
public void printPersons (final String name, final String surname, final String day, final String car, final String city, final String petName) 
{ 

} 

あなたのプロジェクトで?

+1

「これらの値にコンテナオブジェクトを使用する」。あなたは 'Person'オブジェクトを渡すべきです。そうではなく、 'Person'に' to_string() 'を書き、' printPersons() 'メソッドを全く持たないようにしてください。 – Tyler

+0

はい、上の例のコンテナのように見えますか? – profiler

+1

私はクラスについて学ぶことをお勧めします。 http://www.tutorialspoint.com/java/java_object_classes.htm – Tyler

答えて

0

これらのフィールドをすべてカプセル化し、元のメソッドに渡す単純なクラスを定義できます。

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; 
    } 
} 

そして、あなたのメソッドの呼び出しは、現在次のようになります。

public void printPersons(Person person) {} 
+3

多くのString引数を使用して問題をコンストラクタに移動したことがありますか?ユーザーフレンドリーなビルダーでコンストラクタを置き換えることは良い解決策になると私は思います。 – martinhh

+2

コンストラクタへの引数をたくさん持っていることは本当に大きな問題ではありません。非常に多くの議論を提供しているので、その方法のユーザーが何が起こるかを予想することは不可能なので、それを行う公的な方法であれば、それはずっと悪いことです。 –

-1

私にとっては、コンテナオブジェクト(人が)ここで使用されるべきであることは問題外です。 Personインスタンスの構築を容易にするために、内部クラスPersonBuilderが使用されます。コンストラクタまたはセッターは公開されません。

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

ありがとうございました。 PMDメッセージを完全に理解するために大きな問題があることもあります。個人的には、ビルダーのパターンが好きです。 – profiler

+0

'PersonBuilder'は、PMDが文句を言う長いメソッドのシグネチャを避けるために、' Person'コンストラクタに自身を渡す必要があります。 – jaco0646

+0

@ jaco0646あなたは完全に正しいです、私はこれを今変更しました。 PersonBuilder(Person.builder())を取得するためにPersonに静的メソッドを追加し、PersonBuilderのコンストラクタをprivateにしました。 – martinhh

関連する問題