【问题标题】:Constructors with too many parameters [duplicate]具有太多参数的构造函数[重复]
【发布时间】:2020-03-29 19:10:31
【问题描述】:

在不放弃太多的情况下,我正在制作一个具有 9 个属性的对象。让我们以 RPG 为例。

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

鉴于该对象被称为播放器,构造函数

public Player(float strength, float constitution, float fortitude, float dexterity, 
float intelligence, float charisma, float wisdom, float willpower, float perception){}

根据 SonarLint: "构造函数有9个参数,大于7个授权。"

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

谢谢

P.s,如果这个问题的论坛发错了,请指点我正确的!

【问题讨论】:

  • 感谢您迄今为止的回复。我将按照建议查找 Builder Pattern 和“EnumMaps”。在确定最适合我的情况后,我会接受最佳答案!
  • 如果你不使用EnumMap,当你开始为这个类添加更多功能时你会后悔的。

标签: java constructor sonarlint


【解决方案1】:

理想情况下,您可以将班级分成更小的单元并进行组合。

在这种情况下,由于它们似乎都是同一种东西,Map(特别是EnumMap)似乎是合适的。

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

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

【讨论】:

  • EnumMap 是这种特殊情况下的最佳解决方案。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    尝试构建器模式

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

    【讨论】:

      【解决方案4】:

      定义一个有这么多参数的函数是不可取的,也是一种正确的方法。理想情况下,它应该只有 2 到 3 个参数。如果参数多于指定的参数,那么您可以执行以下任何操作。

      • 通过包装参数创建一个类(逻辑的种类 参数分组)。
      • 使用上面指定的构建模式
      • 提供多个构造函数,只需要必需的参数。
      • 如果可以使用某些参数,请在少数情况下使用 setter 方法。

      【讨论】:

      • 阅读名为干净代码的书,它有很多关于正确编码技术的东西。
      • 罗伯特·塞西尔·马丁?
      • @MJDeveloping 是 - Uncle Bob.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      相关资源
      最近更新 更多