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 - 将指向对象的指针传递给函数的主要内容,如果未能解决你的问题,请参考以下文章
如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?