如何将我的变量放在对象的构造函数中

时间:2013-05-18 16:31:51

标签: java

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

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

第一个,

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

第二个,

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

其中每个数组的长度为minValuemaxValue

您认为哪种方式更好?

8 个答案:

答案 0 :(得分: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;
  }
}

答案 1 :(得分:1)

您可以拥有一个包含两个属性(min,max)和一个EnumType(包含10个字段的EnumType)的类

答案 2 :(得分:1)

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

答案 3 :(得分:1)

HashSet&lt;?,MinAndMax&lt;?&gt;&gt;可能更灵活,更易于使用。

答案 4 :(得分: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;
  }
}

答案 5 :(得分:0)

具有2个属性(min,max)的ValueType类,然后是只有一个参数的构造函数:ValueType数组

答案 6 :(得分:0)

你可以参数化集合(参见Pangea的答案),或使用空构造函数,默认值和返回this的setter,有点像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 :(得分:0)

你根本不应该有一个包含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