Каков наилучший способ организовать код Java, поскольку вы не можете передать по ссылке? - PullRequest
5 голосов
/ 13 июня 2010

Я учусь кодировать на Java после того, как пришел из C. В C я всегда разделял все на отдельные функции, чтобы сделать код более легким для отслеживания и редактирования. Я пытался сделать это в Java, но теперь, когда я понял, что вы не можете использовать указатели, я немного озадачен тем, что лучший способ сделать это.

Так, например, я хочу иметь метод, который создает для меня четыре оповещения. Поэтому я передаю ему конструктор оповещений, который затем может создавать оповещения. Я могу вернуть их в массиве, но в моем коде у меня уже есть имена, названные по отдельности, и я бы хотел оставить их так, чтобы мне не приходилось ссылаться на них как alert [1], alert [2]. .. и т. д.

Это означает, что мне придется переименовать их, что добавит дополнительный код, который, вероятно, будет длиннее, чем код в реальном методе!

Думаю ли я об этом правильно? Я могу что-нибудь сделать?

-Edit-

        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setMessage(this.getString(R.string.ache_Q_text))
               .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {dialog.cancel();}
               });

        final AlertDialog ache_Q_alert = builder.create();

        builder.setMessage(this.getString(R.string.food_Q_text));
        final AlertDialog food_Q_alert = builder.create();

        builder.setMessage(this.getString(R.string.event_Q_text));
        final AlertDialog event_Q_alert = builder.create();

        builder.setMessage(this.getString(R.string.ache_Q_text));
        final AlertDialog ache_type_Q_alert = builder.create();

и вместо этого замените его на

createAlerts();

и этот код где-то в стороне.

Ответы [ 4 ]

6 голосов
/ 13 июня 2010

Звучит так, будто вы хотите, чтобы метод создал для вас четыре объекта и вернул их. У вас есть несколько вариантов:

1. Измените свой метод, чтобы создать только один объект, и вызовите его четыре раза, например

Alert foo = createOneAlert(x,y,z);
Alert bar = createOneAlert(a,b,c);
// etc.

2. Создайте структуру данных для хранения ваших предупреждений:

public class Alerts {
  private final Alert foo;
  private final Alert bar;
  private final Alert baz;
  private final Alert quux;

  public Alerts(Alert foo, Alert bar, Alert baz, Alert quux) {
    this.foo = foo;
    this.bar = bar;
    this.baz = baz;
    this.quux = quux;
  }

  public Alert getFoo() { return foo; }
  // etc.

}

public Alerts makeAlerts(AlertBuilder builder) {
  return new Alerts(
    builder.buildAlert(a,b,c),
    builder.buildAlert(d,e,f),
    builder.buildAlert(g,h,i),
    builder.buildAlert(x,y,z));  
}

Это может быть более многословно, но а) это Java и б) многословие может быть хорошей вещью

1 голос
/ 13 июня 2010

Связаны ли эти четыре оповещения? Не могли бы вы создать соответствующий класс, который инкапсулирует четыре из них, включая код для их создания?

Я редко нахожу, что мне нужен метод для возврата нескольких несвязанных элементов - хотя иногда я пропускаю out параметры C # для таких вещей, как int.TryParse (где метод может "не работать" в неисключительной ситуации способ).

0 голосов
/ 13 июня 2010

Здесь есть несколько хороших ответов, особенно davetron5000.

Другой вариант - передать список (или другую коллекцию) в ваш метод createAlerts(); - с компоновщиком или без него. Может быть что-то вроде:

List<Alert> alerts = new ArrayList<Alert>();
createAlerts(builder, alerts);
...

private void createAlerts(AlertBuilder builder, List<Alert> alerts) {
    alerts.add(builder.buildAlert(a,b,c));
    alerts.add(builder.buildAlert(d,e,f));
    alerts.add(builder.buildAlert(g,h,i));
    alerts.add(builder.buildAlert(x,y,z));
}

Вы также можете надеть шапку Spring и связать все предупреждения в XML, а затем внедрить их в коллекцию.

0 голосов
/ 13 июня 2010

Я бы обернул эти предупреждения в класс Alert. В зависимости от разницы, как объекты одного и того же класса или как 4 разных класса.

Затем вы можете передать эти объекты в вашу функцию для их инициализации.

Тогда структура вашего мог бы не сильно измениться.

Это не тот способ, которым все делается в Javaland, но он иллюстрирует, почему отсутствие указателей не создает существенных проблем. В Java классы в основном настраиваются в своем конструкторе, поэтому полный жизненный цикл создания, эксплуатации и уничтожения заключен в классе. (Это что-то вроде приближения). Это позволяет классу «скрывать» детали реализации от внешнего мира, что помогает создавать более надежные приложения.

...