【问题标题】:Too much String parameters in method方法中的字符串参数过多
【发布时间】:2016-11-13 18:51:50
【问题描述】:

有时,我在对我的代码进行一次 PMD 检查时遇到问题。我的意思是 - 太多的字符串参数:

“与其使用大量字符串参数,不如考虑为这些值使用容器对象”

f.e.:

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

}

在你的项目中如何避免这种情况?

【问题讨论】:

  • 通过“为这些值使用容器对象”。你应该传入一个Person 对象。或者更确切地说,你应该只为Personto_string() 而根本没有printPersons() 方法。
  • 是的,但是上例中的容器会是什么样子?
  • 如果您想要快速修复,请使用 String[] 而不是所有这些。从长远来看,您可能需要重新考虑您的代码设计。
  • 那么,我应该新建一个Person类,哪些字段都是参数,然后调用Person对象来printPerson?

标签: java design-patterns coding-style checkstyle pmd


【解决方案1】:

您可以定义一个简单的类来封装所有这些字段,并将其传递给您的原始方法。

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) {}

【讨论】:

  • 也许您只是将许多字符串参数的问题转移到构造函数?!我认为用用户友好的构建器替换构造器将是一个很好的解决方案。
  • 构造函数有很多参数并不是什么大问题。如果它是一个公共方法这样做会更糟,因为该方法的用户不可能预测会发生什么,因为他提供了这么多参数。
【解决方案2】:

对我来说,这里应该使用容器对象(Person)是毫无疑问的。为了使 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;
    }
}

【讨论】:

  • 感谢您提供的所有解决方案。有时我很难完全理解 PMD 消息。就个人而言,我更喜欢构建器模式。
  • PersonBuilder 应该将自己传递给 Person 构造函数,以避免 PMD 抱怨的长方法签名。
  • @jaco0646 你说得对,我现在改了。我还在 Person 中添加了一个静态方法来获取 PersonBuilder (Person.builder()) 并将 PersonBuilder 的构造函数设为私有。
  • 我会从PersonBuilder 中删除所有getter 方法,以缩短代码并阻止客户使用构建器代替Person
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 2021-12-21
  • 2014-09-11
  • 2019-06-08
相关资源
最近更新 更多