假设我已经创建了一个包含字段int value
的A类实例。
int D;
A test = new A();
test.value = 3;
我想创建一个变量D
,它将链接到类实例的此测试值。每当此值更改时,我的变量D
将更改为。如果我知道链接,我可以这样做。当发生变化时,我可以简单地执行以下操作:
D = test.value;
但是,让我们说我希望D
在程序运行时链接到不同的值(来自其他实例,假设为test2
,test3
)。在这种情况下,我可以使用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中使用这样的东西?
答案 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])来解决这个问题,这个数组是一个对象,可以通过引用来引用。