【问题标题】:How to put my variables in the object's constructor如何将我的变量放入对象的构造函数中
【发布时间】:2013-05-13 15:44:14
【问题描述】:

我有一个类,它有大约 20 个属性,可以分为 10 个组,具有 minValuema​​xValue 类型的两个属性。

我想知道如何定义对象的构造函数。我有两个选择:

第一个,

public myClass(minValueType1, maxValueType1, minValueType2,maxValueType2,....,minValueType10, maxValueType10) 

第二个,

public myClass(type1Arr[],type2Array[],......,type10Array[])

其中每个数组的长度为 2,minValuemaxValue

你认为哪种方式更好?

【问题讨论】:

  • 为什么没有一个单一的类型来表示“最小和最大”的组合?这会让事情变得更简单。
  • 我不认为这是必要的,因为没有与这些类型相关的函数。
  • 如果它是一个最小值和一个最大值,我的猜测是代码测试是某个变量 >= min 和 Range 类是合理的@ 方法。即使没有这种方法,将 min 和 max 组合在一起也是有意义的,并且证明了创建这个类是合理的。
  • @JoroSeksa:这与它无关。如果您有成对的相关值,则该配对本身就是要封装的东西,因此您可以在单个值中表示“最小和最大速度”(例如)的概念。我认为您可以也为该类型添加有用的方法 - 例如验证值 - 但这是另一回事。

标签: java


【解决方案1】:

你根本不应该有一个有 20 个参数的构造函数。尝试引入参数对象和/或使用(包装的)Collection

负责检查值有效性的List<Range<T>>Map<Class, Range>RangeConstraints 类怎么样?

链接:

When a method has too many parameters?

best practice for passing many arguments to method?

http://www.refactoring.com/catalog/introduceParameterObject.html

【讨论】:

    【解决方案2】:

    这是一种方法

    class MyClass
    {
      private Map<String, MinMax> others;
      public MyClass(Map<String, MinMax> in)
      {
        others=in;
      }
    }
    
    class MinMax
    {
      private int min;
      private int max;
    
      public boolean isWithinRange(int input)
      {
        return input >= min && input <= max;
      }
    }
    

    【讨论】:

    • 好的,但是我怎么知道例如 minFuelPerHour 和 maxFuelPerHour 或 minAccumulatorValue 和 maxAccumulatorValue 在列表中的位置?
    • @JoroSeksa 然后使用地图(一个选项)。更新了我的答案。使用“fuelPerHour”、“accumulatorValue”等字符串键。
    【解决方案3】:

    为了简化你可以创建一个类如下

    public class Value {
      private int max;
      private int min;
    
      public Value(int min, int max) {
        this.min = min;
        this.max = max;
      }
    
      public int getMax() {
        return max;
      }
    
      public int getMin() {
        return min;
      }
    }
    
    public class YourClass {
    
      // as all the values are same type
      // we can set data inside a Map, 
      // where String will be property name for each min and max type
      private Map<String, Value> data;
    
      public YourClass(Map<String, Value> data) {
        this.data = data;
      }
    
      public Map<String, Value> getData() { 
        return data;
      }
    }
    

    【讨论】:

      【解决方案4】:

      HashSet,MinAndMax>> 可能更灵活,更易于使用。

      【讨论】:

        【解决方案5】:

        我会推荐builder pattern。还有另一个关于主题here 的SO 帖子。这样,您可以保持构造函数简单,同时允许构造不可变对象(如果您愿意)。

        【讨论】:

        • Builder模式可以避免伸缩,但这个问题的真正问题是封装不当。
        【解决方案6】:

        您可以对集合进行参数化(请参阅 Pangea 的答案),或者使用空构造函数、默认值和返回 this 的设置器,有点像 StringBuilder

        这是我对后者的示例:

        封装测试;

        public class Main {
        
            private String myString = "";
            private Integer myInteger = 0;
            // etc...
        
            public Main() {
        
            }
            public Main setString(String value) {
                // TODO check value
                myString = value;
                return this;
            }
            public Main setInteger(Integer value) {
                // TODO check value
                myInteger = value;
                return this;
            }
            @Override
            public String toString() {
                return "My String is: " + myString + " and my Integer is: " + myInteger;
            }
            public static void main(String[] args) {
                System.out.println(new Main().setString("foo").setInteger(1).toString());
            }
        }
        

        【讨论】:

          【解决方案7】:

          一个具有 2 个属性(最小值、最大值)的类 ValueType,然后是一个只有一个参数的构造函数:ValueType 数组

          【讨论】:

            【解决方案8】:

            您可以拥有一个具有两个属性(最小值、最大值)和一个 EnumType(具有 10 个字段的 EnumType)的类

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-04-11
              • 1970-01-01
              • 1970-01-01
              • 2015-12-16
              • 2016-11-19
              • 2012-01-07
              • 2018-02-22
              • 1970-01-01
              相关资源
              最近更新 更多