Java通过最终数组定义类成员

时间:2013-12-20 04:20:52

标签: java class class-members

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

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

2 个答案:

答案 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课程中加入givenNamenickNameName等等:

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问题。