0

我有一个数组,其中包含程序中使用的一些定义:

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应支持按多字段排序,例如首先按名字,然后按姓氏等。

4

2 回答 2

5

为了避免类成员变量的长列表,您可以使用此处提到的属性映射:

Map<String,String> attributesMap = new HashMap<String,String>();

“familyNames”、“givenNames”、“middleNames”、“nickNames”、“additionalNames”等应用作键。

于 2013-12-20T04:24:30.810 回答
0

Person您可以通过在静态工厂方法中获取 attributesMap 在类中定义它。

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;
}

我不完全同意地图方法。事实上,同样有一种代码味道——它被称为“原始痴迷”

您还可以对 a 进行排序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 的问题。

于 2013-12-20T04:32:10.983 回答