我有一个具有大量相似字段的对象(比如超过10个),我必须从可变长度的数组中分配它们。解决方案可能是基于每次检查数组长度并分配每个字段的巨大嵌套ifs
OR
一串ifs检查长度是否超出范围并在检查后每次分配。
两者似乎都是重复的。有更好的解决方案吗?
答案 0 :(得分:4)
如果你的语言有切换的开关/案例,你可以这样做:
switch(array.length){
case 15: field14 = array[14];
case 14: field13 = array[13];
case 13: field12 = array[12];
// etc.
case 1: field0 = array[0];
case 0: break;
default: throw Exception("array too long!");
}
答案 1 :(得分:1)
for (int i = 0; i < fieldCount; i++)
fields[i].value = array[i];
也就是说,维护一个与您的数组值对应的字段数组。
答案 2 :(得分:1)
如果您的语言支持代理,匿名函数,那么您可以使用它们来清理它。例如,在C#中你可以这样写:
string[] values = GetValues();
SomeObject result = new SomeObject();
Apply(values, 0, v => result.ID = v);
Apply(values, 1, v => result.FirstName = v);
Apply(values, 2, v => result.LastName = v);
// etc.
apply方法如下:
void Apply(string[] values, int index, Action<string> action)
{
if (index < values.Length)
action(values[index]);
}
这显然取决于语言,但无论如何都要考虑。
我们可能忽略的另一个非常简单的选项是,如果您实际上尝试从此值数组初始化对象(而不是 update 现有对象) ,如果数组不够大,只接受默认值。
C#示例:
void CreateMyObject(object[] values)
{
MyObject o = new MyObject();
o.ID = GetValueOrDefault<int>(values, 0);
o.FirstName = GetValueOrDefault<string>(values, 0);
o.LastName = GetValueOrDefault<string>(values, 0);
// etc.
}
void GetValueOrDefault<T>(object[] values, int index)
{
if (index < values.Length)
return (T)values[index];
return default(T);
}
有时候,愚蠢的解决方案是最明智的选择。
答案 3 :(得分:0)
如果您的字段以与数组元素相同的顺序声明,则可以使用反射(如果您的语言可用)来设置这些值。以下是如何在Java中执行此操作的示例:
// obj is your object, values is the array of values
Field[] fields = obj.getClass().getFields();
for (int i = 0; i < fields.length && i < values.length; ++i) {
fields[i].set(obj, values[i]);
}