Java - 引用“稍后要解决”

时间:2016-05-03 13:00:56

标签: java arrays reference tree

有没有办法在Java中定义“指针指针”?

即。我在考虑这样的事情......

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Test[] test = new Test[20];

        Test t = test[10];

        test[10] = new Test(7);

        System.out.println(t.whatever);
    }
}

class Test{
    public Test(int i){this.whatever = i;}
    Integer whatever;
}

这显然会在Java中产生nullptr异常。我怎样才能保持更新?

即。如果这是C,我可能会写得有点像这样:

typedef struct{
    int whatever;
} Test;

int main(int argc, char* argv[]) {

    Test *test = malloc(sizeof(*test) * 20);
    Test *t = &test[10];

    test[10].whatever = 7;
    printf("%d\n",t->whatever);

    return 0;
}

我正在考虑这样的事情的原因是我正在尝试从文件中解析树,其中每个节点的子节点仅由nodeID数组给出。

如果我可以忽略这样一个事实是很方便的,即已经解析了一个孩子,或者只是指向一个数组条目(对应于孩子的nodeID的索引),从而放弃了再次遍历所有节点的需要以后只是插入子指针。

我考虑过创建一个包装器实例数组,并使用对它们的引用。我能做得更好吗?

2 个答案:

答案 0 :(得分:2)

不幸的是,这不能在java中工作,因为指针不存在于java中,唯一的方法是使用像AtomicReference这样的Object包装器。

NB: AtomicReference并不适合用于此类需求,因为它基于volatile变量,在您的情况下不是必需的,但它是这个想法。

答案 1 :(得分:1)

  

我试图从文件中解析树,其中每个节点的子节点仅由一组节点ID给出。

您可以使用Supplier<T>执行此操作,该实现能够按需生成T的接口:

final Test[] test = new Test[20];
Supplier<Test> t = () -> test[10];
test[10] = new Test(7);
System.out.println(t.get().whatever); // Prints 7
test[10] = new Test(42);
System.out.println(t.get().whatever); // Prints 42

Demo 1.

如果您无权访问Java-8,那么这是一个使用接口和匿名类的实现:

interface ForwardTest {
    Test get();
}

class Main {
    public static void main (String[] args) throws java.lang.Exception {
        final Test[] test = new Test[20];
        ForwardTest t = new ForwardTest() {public Test get() {return test[10];} };
        test[10] = new Test(7);
        System.out.println(t.get().whatever);
    }
}

class Test {
    public Test(int i){this.whatever = i;}
    Integer whatever;
}

Demo 2.