有没有办法在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的索引),从而放弃了再次遍历所有节点的需要以后只是插入子指针。
我考虑过创建一个包装器实例数组,并使用对它们的引用。我能做得更好吗?
答案 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
如果您无权访问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;
}