Каков идиоматический Groovy способ отразить метод экземпляра? - PullRequest
0 голосов
/ 05 апреля 2011

Вот пример кода для вопроса

class Foo {
  String a()
  String b()
}

Начальная версия бара

class Bar {
  List<Foo> foos = new ArrayList<Foo>()

  String getAs() {
    def builder = new StringBuilder()

    foos.each {
        builder.append it.a()
        builder.append System.getProperty("line.separator")
    }

    builder.toString()
  }

  String getBs() {
    def builder = new StringBuilder()

    foos.each {
        builder.append it.b()
        builder.append System.getProperty("line.separator")
    }

    builder.toString()
  }
}

Итак, я хочу реорганизовать это.В настоящее время у меня есть это:

class Bar {
  List<Foo> foos = new ArrayList<Foo>()

  String getAs() {
    collectSections "a"
  }

  String getBs() {
    collectSections "b"
  }

  private String collectSections(String method) {
    def builder = new StringBuilder()

    foos.each {
        builder.append it."${method}"()
        builder.append System.getProperty("line.separator")
    }

    builder.toString()
  }
}

Это самый лучший способ сделать это?

1 Ответ

1 голос
/ 05 апреля 2011

Я бы сделал это следующим образом, поскольку он абстрагирует алгоритм сбора и использует стандартные методы манипуляции коллекцией Groovy.

class Bar {
  List<Foo> foos = new ArrayList<Foo>()

  String collect(values) {
    values.inject(new StringBuilder()) { b, val ->
        b << val + System.getProperty("line.separator")
    }.toString()
  }

  String getAs() {
    collect foos*.a()
  }

  String getBs() {
    collect foos*.b()
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...