【问题标题】:How to create array or Collection of anonymous class objects如何创建匿名类对象的数组或集合
【发布时间】:2018-09-06 17:54:28
【问题描述】:

我需要创建一个匿名类对象的数组或集合。

例如我的构造函数的 toString 是:

public String toString() {
    return String.format("%10s%12s%12d", getFirstName(), getLastName(), getAge());
}

我可以创建MyClass 对象的列表:

List<MyClass> list = new ArrayList<>();

但现在我需要用匿名类覆盖toString 方法 并使用新的toString 方法创建一个新集合:

MyClass myClass = new MyClass() {
    public String toString() {
        return String.format("%s%12s%12d", getFirstName(), getLastName(), getAge());
    }
};

如何实现?

提前谢谢你。

【问题讨论】:

  • 只需使用List&lt;User&gt;
  • 您是否有理由为此需要使用匿名类?您将为每个元素创建一个新类(不仅仅是对象),这是一种相当笨拙的方法。你想做什么?你的User在不同的时间有不同的显示方式吗?
  • 我同意@Kayaman。恕我直言,您发出的声音就像 OO 设计问题一样-即。您可能应该使用多个派生类,它们将以不同的方式实现 toString,但仍将基于相同的基类。
  • 他没有为每个元素创建一个新的匿名类。他正在创建MyClass 的匿名子类的实例。回答问题:例如使用List&lt;? extends MyClass&gt;
  • 比如我需要改成toString方法

标签: java arrays list arraylist collections


【解决方案1】:

如前所述,您无法更改 Java 类中的方法,因此您有多种选择,具体取决于您需要做什么。

您可以创建一个 UserWrapper 包装 User,覆盖 toString() 并且所有其他方法调用都委托给它包装的 User 对象。

您可以修改User 类以包含格式字符串,这将允许您执行user.setFormat("%s%12s%12d"); 之类的操作,而toString() 将使用它进行显示。

您可以完全从 User 中删除格式,因为从设计的角度来看,它并不是真正的工作,当您需要显示用户的详细信息时,它将在不同的类中完成,例如 @987654329 @。

最后一个可能是最合理的设计,您可以在您打算显示列表内容的地方执行此操作(也不依赖于列表的默认 toString() 实现),类似于

public void printList() { // Or build the String and return if you don't
    for(User u : myList)  // want to display it here
        System.out.println(format(u));
}
private String format(User u) {
    return String.format(""%s%12s%12d", u.getFirstName(), u.getLastName(), u.getAge());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2017-07-28
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多