Java - 将指向对象的指针传递给函数

Posted

技术标签:

【中文标题】Java - 将指向对象的指针传递给函数【英文标题】:Java - pass a pointer to an object to a function 【发布时间】: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。 创建一个包含两个值作为字段的类。并返回这个类的一个实例。 【参考方案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 库方法中使用了这个成语。

【讨论】:

以上是关于Java - 将指向对象的指针传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

向函数中传递指针和传递指针的引用的区别

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?

将指向局部变量的指针传递给函数:它安全吗?

将指针传递给函数并更改它指向的地址[重复]

C++ 将指针传递给函数 (Howto) + C++ 指针操作

将指向外部类模板的成员函数的指针传递给嵌套类