有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想要实现的是这样的目标:

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

共 (5) 个答案

  1. # 1 楼答案

    <>不,没有更好的方法,因为在java中,没有C++中指针的指针。

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

  2. # 2 楼答案

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

  3. # 3 楼答案

    为什么不简单地:

    MyClass object = doStuff();
    

    这是更直观的。否则必须传递引用(而不是指针!)如您所识别的,将容器对象添加到方法中。这在Java世界中并不常见

  4. # 4 楼答案

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

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

    或者你可以用自己的方式来做。还可以使用反射调用方法

    Method method = foo.getClass().getMethod("doSomething", null);
    method.invoke(foo, null);
    
  5. # 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。这是我认为类中的公共字段可以使用的极少数情况之一。因为定义一个简单的类只是为了用作函数结果,而不是表示一个连贯的概念,所以通常关于定义访问器而不是公开字段等的担忧实际上并不适用。(顺便说一句,我只是猜测另一种类型是^{),但它当然可以是任何类型。)

    另一个解决方法:

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

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