【问题标题】:What is the best way to organize Java code since you can't pass by reference?既然不能通过引用传递,那么组织 Java 代码的最佳方法是什么?
【发布时间】:2010-06-13 17:24:41
【问题描述】:

从 C 毕业后,我正在学习如何用 Java 编写代码。在 C 中,我总是将所有内容分成单独的函数,以使代码更易于理解和编辑。我试图在 java 中做到这一点,但现在因为我意识到你不能使用指针,我有点困惑最好的方法是什么。

因此,例如,我想要一个为我创建四个警报的方法。所以我将它传递给一个警报构建器,然后可以创建警报。我可以将它们返回到一个数组中,但是在我的代码中,我已经分别命名了警报,并且我想保持这种方式,这样我就不需要将它们称为警报 [1]、警报 [2]。 ..等等

这意味着我必须重命名它们,这将添加可能比实际方法中的代码更长的额外代码!

我是否以正确的方式思考这个问题?有什么我可以做的吗?

-编辑-

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

并将代码放在一边。

【问题讨论】:

  • 我不确定您到底要做什么,但是有没有办法减少创建警报的方法以创建单个警报?
  • 一些示例代码可能会明确您的问题到底是什么。在 Java 中,每个对象都是通过引用传递的 ...
  • @Arne:小心,Java 是按值传递的。只是对于Objects来说,值本身就是一个引用。
  • 看这个..为了纠正我们自己的 Jon Skeet 引用传递的神话..yoda.arachsys.com/java/passing.html

标签: java c pass-by-reference


【解决方案1】:

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

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) 冗长 可以 是一件好事

【讨论】:

  • 谢谢,这就是我所做的。最后我只做了四次。警报是不相关的。它们仅用于单击问号并解释某些内容的按钮。然而,这对我来说仍然很奇怪,因为我习惯于在 C 中编程,其中 main 函数中不应该有任何代码......根本......除了驱动程序。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    那么你的结构不会有太大变化。

    这不是 Javaland 中的处理方式,但它说明了为什么缺少指针不会造成重大问题。 Java中的类大多配置在其构造函数中,因此创建、操作和销毁的完整生命周期都封装在类中。 (这有点近似)。这允许该类向外界“隐藏”实现细节,这有助于构建更健壮的应用程序。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2019-02-26
        • 2014-04-28
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 2012-06-27
        • 1970-01-01
        • 2016-01-25
        • 2015-10-29
        相关资源
        最近更新 更多