说方式有一个变量(比如说String Str),Str的值开始为""然后当一些代码运行它被设置为"test"然后在代码中的其他地方再次更改为"tester".现在在程序中我想知道Str的先前值是什么.这在Java中可行吗?
所以我说变量变了两次,你想在第二次改变之前找出Str是什么.因此在上面的示例中,Str的最新值将是"tester",但我想在此之前找出Str是什么(假设您在将其更改为测试人员之前不知道它是什么)在这种情况下我想要成为能够发现Str是"测试".
是否可以在Java中执行此操作?
不,这是不可能的,您必须在更改之前保存以前的值以执行您要求的操作.
不是语言的本地部分,没有.但是,当String更改时,您可以编写一个保存当前(上一个?)值的setter.
private String str; private String prev; setStr(String s) { prev = str; str = s; }
然后只需写一个单独的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()); } }