我有一个类,它有大约20个属性,可以分为10组,有两个属性类型为 minValue 和 maxValue 。
我想知道如何定义对象的构造函数。我有两个选择:
第一个,
public myClass(minValueType1, maxValueType1, minValueType2,maxValueType2,....,minValueType10, maxValueType10)
第二个,
public myClass(type1Arr[],type2Array[],......,type10Array[])
其中每个数组的长度为minValue
和maxValue
。
您认为哪种方式更好?
答案 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