我有一个数组,其中包含程序中使用的一些定义:
final String[] names = new String[]{"familyNames", "givenNames", "middleNames", "nickNames", "additionalNames", ..., ..., ..., ...}; // Lots of definitions
现在我需要创建一个包含这些定义的新类:
public class Person {
final private String id;
final private String familyNames;
final private String givenNames;
final private String middleNames;
final private String nickNames;
final private String additionalNames;
...
...
...
...
... // Very long list
}
是否可以通过该数组定义此类?类似的东西:
public class Person {
final private String id;
final private .... names...
public int compareTo(...) {...}
}
此Person
类应支持按多个字段排序,例如首先是给定的名字,然后是姓氏等等。
答案 0 :(得分:5)
为了避免一长串的类成员变量,您可以使用这里提到的属性映射:
Map<String,String> attributesMap = new HashMap<String,String>();
“familyNames”,“givenNames”,“middleNames”,“nickNames”,“additionalNames”等应该用作键。
答案 1 :(得分:0)
您可以通过在静态工厂方法中使用attributesMap在类Person
中定义它。
public class Person {
final private String id;
final private Name name;
...
public static Person fromAttributesMap(Map<String, String> attributesMap) {
Person person = new Person();
person.id = attributesMap.get("id");
...
}
}
但是要将相关属性保存在自己的类中。例如;你可以在familyName
课程中加入givenName
,nickName
,Name
等等:
class Name {
final private String familyName;
final private String givenName;
final private String middleName;
}
我不完全同意地图方法。事实上,围绕着同样的代码气味 - 它被称为“原始的痴迷”
您还可以对List<Person>
进行排序,例如按姓氏排序:
public static Comparator<Person> FamilyNameComparator
= new Comparator<Person>() {
public int compare(Person person1, Person person2) {
//ascending order
return person1.getFamilyName().compareTo(person2.getFamilyName());
}
};
然后致电:
Arrays.sort(persons, Person.FamilyNameComparator);
您还可以按多个字段排序。请看一下关于SO的this问题。