我如何在java中执行此操作,因为指针不存在?

时间:2018-01-13 14:17:57

标签: java pointers

假设我已经创建了一个包含字段int value的A类实例。

int D;
A test = new A();
test.value = 3;

我想创建一个变量D,它将链接到类实例的此测试值。每当此值更改时,我的变量D将更改为。如果我知道链接,我可以这样做。当发生变化时,我可以简单地执行以下操作:

D = test.value;

但是,让我们说我希望D在程序运行时链接到不同的值(来自其他实例,假设为test2test3)。在这种情况下,我可以使用switch语句,并根据链接使用不同的命令。

switch (help_var):
    case 1:
        D = test.value;
        break;
    case 2:
        D = test2.value;
        break;
    case 3:
        D = test3.value;
        break;

更改指针非常有用。程序运行时,我的指针会改变。在C中,我会在每种情况下执行以下操作:

D = *pointer;

有没有办法将(test.value)引用放在变量中并在Java中使用这样的东西?

5 个答案:

答案 0 :(得分:3)

事实证明,从版本1.8开始,java已经内置了IntegerProperty类,但由于它的API在某种程度上超出了这个问题,所以让我给出一个极简主义的例子:

public class IntContainer {
    private int i;

    public int getValue();
    public void setValue(int value);

}

这样的容器类将与C指针一样 about ,但是首先比较它们是没有意义的。
但是,当您使用int value(或IntegerProperty)替换IntContainer pointer并更改IntContainer's值时,对于持有对同一IntContainer的引用的每个实例,都会显示修改。 1}}。

答案 1 :(得分:1)

您通过访问类A内部属性来违反封装信息隐藏原则。

要解决此问题,您应该将使用该值的计算移动到类A中的单独方法(如果它以某种方式取决于A或其子类)或另一个可以传递的类类A的方法,以便A可以传递其值:

interface MyCalculation{
  int calculateWith(inf value);
}

class A {
  inf test = 42;

  int doThis(MyCalculation calculation){
    return calculation.calculateWith(test);
  }
}

// somewhere else:

A a = new A();
int D = a.doThis(value->42*value);

答案 2 :(得分:0)

正如您已经注意到Java中没有任何指针。

因此,您需要创建一些包装器来实现所需的行为,尤其是对于int这样的原始类型。

一个选项是@Izruo已经回答,将值嵌入到包装器中,使用自定义类或类似IntegerProperty的内容。

另一种选择是创建一个创建回调函数,该回调函数返回所需变量的值。 (这基本上是@Timothy Truckle回答背后的想法。)

例如Supplier<T>

public class Callback<T> {
    private Supplier<T> supplier;

    public void link(Supplier<T> to) {
        supplier = to;
    }

    public T get() {
        if(supplier == null)
            return null;
        return supplier.get();
    }
}

要链接值,您可以使用:

Callback<Integer> d = new Callback<>();
d.link(() -> test.value);
System.out.println(d.get());

答案 3 :(得分:0)

简单回答:你不能用Java做到这一点。

如果你想模仿它,你将不得不模拟创建“可变”的整数对象。

public class MutableInteger {
  private int value=0;
  public void setValue(int i){
      value=i;
  }
  public int getValue(){
     return value;
  }
}

然后你可以写:

MutableInteger D;
A test = new A();
test.value = new MutableInteger() ;
D=test.value;

这样,修改test.value会影响D,反之亦然

答案 4 :(得分:-1)

在Java中,您只能引用对象。 int是基本类型而不是对象。这意味着您无法引用int类型的字段。

有时候人们会使用大小为1的数组(int [1])来解决这个问题,这个数组是一个对象,可以通过引用来引用。