参数过多的构造函数

Constructors with too many parameters

不用透露太多,我正在制作一个具有 9 个属性的对象。让我们以角色扮演游戏为例。

float strength, constitution, fortitude, dexterity, intelligence, charisma, wisdom, willpower, perception;

鉴于对象名为player,

的构造函数
public Player(float strength, float constitution, float fortitude, float dexterity, 
float intelligence, float charisma, float wisdom, float willpower, float perception){}

根据 SonarLint: "Constructor has 9 parameters, which is greater than 7 authorized."

虽然我知道 SonarLint 说这不会阻止代码实际运行,但如果有 "proper" 处理这些情况的方法,我很想知道!

谢谢

P.s,如果这个问题是错误的论坛,请指出正确的论坛!

尝试使用Builder Pattern,这种方法非常适合类 4+参数

理想情况下,您会将 class 拆分成更小的单元并进行组合。

在这种情况下,因为它们似乎都是同一类东西,所以 Map(具体来说 EnumMap)似乎是合适的。

作为最后的手段,有建造者模式。

 Player player = Player.builder()
     .strength(       )
     .constitution(   )
     // ...
     .perception(     );

尝试构建器模式

final class Player {
  private final float strength;

  ...

  static final class Builder {
    private float strength;

    ...

    Builder setStrength(float strength) {
      this.strength = strength;
      return this;
    }

    ...

    Player build() {
      return new Player(this);
    }
  }

  private Player(Builder builder) {
    strength = builder.strength;
    ...
  }

  ...

  public static void main(String[] args) {
    Player player = new Player.Builder()
      .setStrength(18)
      .setConsitution(18)
      .setFortitude(18)
      .build();
   }
}

定义一个函数有很多 arguments.Ideally 它应该有 2 到 3 个参数 only.In 如果有比指定参数更多的情况,那么你可以这样做以下任何一项。

  • 通过包装参数(有点逻辑 参数分组)。
  • 使用上面指定的构建模式
  • 仅提供必需参数的多个构造函数。
  • 使用 setter 方法做一些事情,如果你可以使用某些参数。