1

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

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

第一,

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

第二个,

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

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

你认为哪种方式更好?

4

8 回答 8

4

这是一种方法

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;
  }
}
于 2013-05-18T16:36:45.327 回答
1

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

于 2013-05-18T16:42:49.540 回答
1

为了简化事情,您可以创建一个类,如下所示

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;
  }
}
于 2013-05-18T16:45:41.020 回答
1

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

于 2013-05-18T16:40:15.530 回答
1

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

于 2013-05-18T16:35:07.757 回答
0

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

负责检查值有效性的a List<Range<T>>、 aMap<Class, Range>或class 怎么样?RangeConstraints

链接:

当一个方法有太多参数时?

将许多参数传递给方法的最佳实践?

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

于 2013-05-18T17:06:59.787 回答
0

您可以对 Collections 进行参数化(请参阅 Pangea 的答案),或者使用空构造函数、默认值和 setter 返回this,有点像 in 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());
    }
}
于 2013-05-18T16:39:46.873 回答
0

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

于 2013-05-18T16:37:45.923 回答