由于您无法通过引用传递,因此组织Java代码的最佳方法是什么?

时间:2010-06-13 17:24:41

标签: java c pass-by-reference

我正在学习如何在从C开始之后使用Java进行编码。在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 个答案:

答案 0 :(得分:6)

听起来你想要一个方法为你创建四个对象并返回它们。您有几个选择:

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

它可能更冗长,但a)Java和b)详细程度可以是好事

答案 1 :(得分:1)

这四个警报是否相关?你能创建一个适当的类来封装其中的四个,包括创建它们的代码吗?

我很少发现我需要一种方法来返回多个不相关的项目 - 尽管我偶尔会错过C#的out参数,例如int.TryParse(方法可能会“失败”)以非特殊方式)。

答案 2 :(得分:0)

我会将这些警报包装在Alert类中。根据差异,可以是同一类的对象,也可以是4个不同的类。

然后,您可以将这些对象传递给您的函数以初始化它们。

然后你的能力结构不会发生太大变化。

这不是在Javaland中完成任务的方式,但它说明了为什么缺少指针不会带来重大问题。在Java中,类主要在其构造函数中进行配置,因此创建,操作和销毁的完整生命周期将封装在类中。 (这有点近似)。这允许类从外部“隐藏”实现细节,这有助于构建更强大的应用程序。

答案 3 :(得分:0)

这里有一些很好的答案,尤其是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连接所有警报,然后将它们作为集合注入。