2016-07-11 3 views
0

경우에 따라 코드에 대한 PMD 검사에 문제가 있습니다. 내 말은 - 너무 많은 문자열 매개 변수 :메서드에 문자열 매개 변수가 너무 많습니다.

철에게 "보다는 문자열 인수를 많이 사용하여, 그 값에 대한 컨테이너 개체를 사용하는 것이 좋습니다"

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 네가 완벽하게 맞았다. 나는 이것을 바꿨다. 또한 Person 클래스에 정적 메서드를 추가하여 PersonBuilder (Person.builder())를 가져 와서 PersonBuilder 생성자를 private으로 만들었습니다. – martinhh

관련 문제