说方式有一个变量(比如说String Str),Str的值开始为""然后当一些代码运行它被设置为"test"然后在代码中的其他地方再次更改为"tester".现在在程序中我想知道Str的先前值是什么.这在Java中可行吗?
所以我说变量变了两次,你想在第二次改变之前找出Str是什么.因此在上面的示例中,Str的最新值将是"tester",但我想在此之前找出Str是什么(假设您在将其更改为测试人员之前不知道它是什么)在这种情况下我想要成为能够发现Str是"测试".
是否可以在Java中执行此操作?
Bil*_*ard 11
不是语言的本地部分,没有.但是,当String更改时,您可以编写一个保存当前(上一个?)值的setter.
private String str;
private String prev;
setStr(String s)
{
prev = str;
str = s;
}
Run Code Online (Sandbox Code Playgroud)
然后只需写一个单独的getter prev.
当然,这个解决方案依赖于你总是使用setter来改变它的值str.
此外,正如驱虫所指出的,如果您的程序不需要此信息,那么您不应修改程序以保存它.如果您需要用于调试的信息,可以在IDE的调试器中设置监视.
简单回答,没有.
但是,您可以使用:
AOP框架(例如AspectJ)可以拦截对变量的赋值.
请参阅AspectJ切入点参考
您可以使用标准JavaBean setter,getters来封装您的字段.然后,您可以在bean上注册侦听器以侦听属性更改,甚至否决该更改.
有关更多信息,请参阅JavaBean规范.
示例监听器:
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
public class MyBeanListener implements PropertyChangeListener,
VetoableChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.printf("Notifed of property changed event: %s => %s%n", evt
.getOldValue(), evt.getNewValue());
}
@Override
public void vetoableChange(PropertyChangeEvent evt)
throws PropertyVetoException {
System.out.printf("Notified of vetoable change event: %s => %s%n", evt
.getOldValue(), evt.getNewValue());
}
}
Run Code Online (Sandbox Code Playgroud)