【问题标题】:Java - pass a pointer to an object to a functionJava - 将指向对象的指针传递给函数
【发布时间】:2014-03-31 08:23:00
【问题描述】:

我想要实现的是这样的:

MyClass object = null;
doStuff(&object);

// `object` can now be non-null

我目前正在做的是这个,但我认为在Java中必须有更好的方法来实现这种行为:

MyClassPointer pointer = new MyClassPointer(null);
// pointer.object is null
doStuff(pointer);

// pointer.object can now be non-null

【问题讨论】:

  • 看看here
  • MyClass object = doStuff() 怎么样?
  • Java 中没有指针。实现某种形式的“out”或“by ref”调用语义的唯一方法是 mutate 作为参数提供的对象 - 如后一种情况所示。我建议将 doStuff 简单地 return 设为一个有用的(复合)值。
  • doStuff() 有不同的返回值。将函数视为返回两个值,一个直接通过 return,另一个通过这个 hack。
  • 创建一个包含两个值作为字段的类。并返回这个类的一个实例。

标签: java pointers reference pass-by-reference pass-by-value


【解决方案1】:

为什么不简单:

MyClass object = doStuff();

这是更多更直观的恕我直言。否则,您必须将容器对象的引用(而不是指针!)传递给您的方法,正如您已经确定的那样。这在 Java 世界中并不常见。

【讨论】:

  • doStuff() 有不同的返回值。将函数视为返回两个值,一个直接通过 return,另一个通过这个 hack。
  • doStuff() 可能是 doTooMuch()?我敢肯定,通过一些上下文来解决这将是微不足道的。
  • 你有 133k 的声望,请不要告诉我你想不出一个有多个返回值的函数……
  • @Jenox。感谢您注意到我的声誉评分(我不喜欢吹牛)。我建议返回两个值的方法不是特别好的设计。返回一个元组是一个选项,但是如果这两个值是相关的,我更喜欢一个对象。如果不相关,那么我认为该方法正在做两件不同的事情。
  • @BrianAgnew 哦,哈哈,我什至没有注意到第一条评论不是你的。我同意这种设计模式不是最优的,但有时它更容易使用。 Example by Apple。在我的例子中,它是一个递归函数,它在多次可能的移动之后评估游戏的状态(因此返回一个双精度数),并且只在递归的顶层保存/返回最佳移动。
【解决方案2】:

据我所知,Java 语言是做到这一点的唯一方法。 但是你可以简单地在你的类中实现方法。在你的方法中也有可能返回你的对象。

public MyObject myFunction(){
//do stufff...
return new MyObject();
}
MybObject object = myFucntion();

或者您可以按照自己的方式进行操作。您还可以使用反射调用您的方法。

Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);

【讨论】:

    【解决方案3】:

    不,没有更好的方法,因为在 Java 中你没有指针在 C++ 中的方式。

    在 Java 中引用(很像 C++ 中的指针)不能直接访问并且总是按值传递。因此,您无法更改方法中引用的值。

    【讨论】:

      【解决方案4】:

      使用Visitor pattern,您的 MyClass 是 dostuff 必须“访问”的对象

      【讨论】:

      • 这与“访问者模式”无关。
      • 如果它无事可做,它可能有:如果它传递一个引用只是为了在 doStuff 中收集一些数据呢?
      【解决方案5】:

      如果你真的希望doStuff 返回两个值: 很可能有更好的设计方法。不过,如果您认为让doStuff 返回两个值确实是最好的设计,则可以使用简单的帮助类来完成:

      static class MyClassAndBoolean {
          public MyClass obj;
          public boolean b;
          public MyClassAndBoolean(MyClass obj, boolean b) { this.obj = obj; this.b = b; }
      }
      

      然后将doStuff 的返回类型更改为MyClassAndBoolean。这是我认为类中的公共字段可以的极少数情况之一。由于您定义一个简单的类只是为了用作函数结果,而不是表示一个连贯的概念,因此通常对定义访问器而不是公开字段等的担忧并不真正适用。 (P.S. 我只是猜测 boolean 是另一种类型,但它当然可以是任何东西。)

      另一种解决方法:

      MyClass[] obj = new MyClass[1];
      result = doStuff(obj);
      

      doStuff 的参数类型更改为MyClass[],并将新对象填充到parameter[0] 中。我确实看到在一些 Java 和 Android 库方法中使用了这个成语。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 2017-08-09
        • 1970-01-01
        相关资源
        最近更新 更多