【问题标题】:Java define class members by a final arrayJava通过最终数组定义类成员
【发布时间】:2013-12-20 04:20:51
【问题描述】:

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

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

【问题讨论】:

  • 您是只存储字符串,还是混入其他类型,您需要作为该类型访问(即,对整数/浮点数执行数学运算,得到从某个日期开始的下个月等)?对于排序,您需要使用@Juned 的答案实现Comparable

标签: java class class-members


【解决方案1】:

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

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

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

【讨论】:

  • 对于没有构建任何 Java 编译器的任何人来说,这可能是更好的选择... :)
  • 刚刚更新了我的问题。要求是按多字段对Person 对象进行排序。看来我需要在课堂上添加CompareTo(),但不确定如何根据地图进行操作?
【解决方案2】:

您可以通过在静态工厂方法中获取 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");
      ...
  }
}

但请务必将相关属性放在各自的类中。例如;你可以在Name 类中加入familyNamegivenNamenickName 等:

class Name {
  final private String familyName;
  final private String givenName;
  final private String middleName;
}

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

您还可以对List&lt;Person&gt; 进行排序,例如按姓氏:

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

您还可以按多个字段排序。看看this关于 SO 的问题。

【讨论】:

  • 程序如何知道数组中的字段 X、Y、Z...实际上在子对象中?正如问题似乎在问的那样,这些东西应该如何自动生成?
  • 通过实现适当的构造函数,或像“fromAttributeMap()”这样的工厂方法。我可能会更新我的答案;但我仍然坚持反对直接使用哈希图。
  • @cHao 我不确定 OP 是否想在“名称”数组中建模即席/随机字符串。我可能会更新我的答案(并讨论使用工厂方法)。
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2013-02-02
相关资源
最近更新 更多