在这个例子中使用Reflection是否合适

时间:2016-04-29 11:20:16

标签: java reflection static-variables

我在这个问题上问你的意见,因为我不确定在这种情况下我应该使用反射。

场景是我有一个表,我需要找出是否处于脏状态。如果用户对表格进行了更改,然后导航到另一个页面而不保存更改...则会弹出一条警告消息,说明"未保存的更改将丢失"。

我使用的方法是创建一个标志,如果表是脏的,则设置为true,否则设置为false。当用户导航离开而不保存表格时,通过单击链接(将他带到另一个站点的链接),会弹出警告消息。另一方面,如果用户在导航之前保存表格,则不会出现警告消息。

如果我将脏标志设置为静态可能会出现的问题是另一个用户可能会遇到不应该处于该状态的标志。由于静态变量绑定到类,每次检查此变量时,该字段的值将在应用程序中的每个用户之间共享,不是吗?

然而,另一方面,如果我不将它设置为静态并将其用作成员变量,那么当我通过反射实例化对象时,它将返回默认值。如果是布尔值则返回false,如果将String和/或任何值初始化为。

,则返回null

这使我得出结论,反射不是在这个例子中使用的最佳选择?

我期待着您的回复,非常感谢您的意见/观点。

非常感谢你。

2 个答案:

答案 0 :(得分:1)

您的表将由TableModel支持。 TableModel的实例向用户显示数据页面,并允许用户编辑该模型中的数据,应该"知道"如果它处于保存状态。

这可以通过创建自定义表模型并添加脏标志来完成 - 每次调用setValueAt时都会触发该标记:

public class DirtyTableModel extends DefaultTableModel {

  protected boolean dirty;

  public boolean isDirty() {
    return dirty;
  }
  /**
   * Called with setDirty(false) after save
  */
  public void setDirty(boolean on) {
    dirty = on;
  }
  @Override
  public void setValueAt(Object aValue, int row, int column) {
    setDirty(true);
    super.setValueAt(aValue, row, column);
  }

}

无需任何反映。

答案 1 :(得分:0)

这个标志没有理由static。使其成为static意味着它是的属性,而不是特定的实例。换句话说,那就是说所有 MyTable个实例都是脏的或没有,这没有任何意义。你应该将这个标志作为一个实例变量,并在构造函数中初始化它(或者内联,这只是将初始化放在构造函数中的语法糖)。你是否使用反射来初始化表格实例似乎无关紧要。