Как избежать внутренних классов, возвращающих значения через один массив элементов? - PullRequest
2 голосов
/ 13 марта 2012

Мне нужно было вернуть значение из анонимного внутреннего класса.Конечно, внутренние классы могут закрываться только по окончательным переменным, что приводит к этому ужасному обходному пути:

public String sampleMethod(){
  final String[] output = new String[1];
  findResult(new SampleOperation(){
    @Override
    private void perform(){
      output[0] = "result";
    }
  });
  return output[0];
}

private void findResult(SampleOperation op){
  op.perform();
}

private static interface SampleOperation {
  void perform();
}

Очевидно, упрощенный пример;здесь класс легко удаляется, но главная проблема в этом.Если есть зависимость внизу (внутри findResult (), например, защелки, которая должна быть запущена), то развертывание такого класса становится непрактичным.запахи, которые я когда-либо сталкивался.

Есть ли разумный способ получить тип возврата от такого делегата?(т.е. не использовать это?)

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Проблема здесь в том, что SampleOperation.perform возвращает void. Просто сделайте так, чтобы он возвращал String (или был бы универсальным), и это нормально:

public String sampleMethod(){
  return findResult(new SampleOperation(){
    @Override
    private String perform() {
      return "result";
    }
  });
}

private String findResult(SampleOperation op){
  return op.perform();
}

private static interface SampleOperation {
  String perform();
}

В конечном счете, когда вы думаете о «мне нужно вернуть значение», вы должны думать о значении, возвращаемом методом.

2 голосов
/ 13 марта 2012

Лучшим шаблоном для этого является использование интерфейса обратного вызова:

final ResultSender<String> sender = ...;
findResult(new SampleOperation(){
    @Override
    private void perform(){
      sender.send("result");
    }
  });

Переменная sender все еще здесь конечна, но, по крайней мере, шаблон можно использовать повторно, и вам не нужно создавать обход на основе массива..

...