在内部 类 中访问的原子变量

Atomic Variables Accessed within inner classes

所以我在这里进行排序并使用内部 class 实现 Comparator 接口,exceptionMessage 和 didJsonParsingFailed 是在内部 class 之外声明的变量,现在 java 没有允许使用内部 class 访问局部变量,所以这给了我一个错误,但是当我将这两个变量设置为原子变量时,“AtomicReference”和“AtomicBoolean”,在这种情况下程序运行正常,我无法了解其背后的原因。让它成为 Atomic 有什么帮助? java 是否允许访问内部 class.

中的 AtomicVariables

P.S- 我必须在我的 catch 块中修改这些变量,所以我不能让它成为最终的

Collections.sort(list, new Comparator() {
        private static final String KEY_NAME = "createdDateTime";

        @Override public int compare(Object o1, Object o2) {
          String str1;
          String str2;
          Date d1 = new Date();
          Date d2 = new Date();
          try {
            str1 = (String) ((JSONObject) o1).get(KEY_NAME);
            str2 = (String) ((JSONObject) o2).get(KEY_NAME);
            d1 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss").parse(str1);
            d2 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss").parse(str2);
          } catch (JSONException | ParseException e) {
            exceptionMessage = "xyz";
            didJsonParsingFailed = true;
          }
          return d1.compareTo(d2);
        }

      });

How does making it Atomic helps? Does java allows access of AtomicVariables in inner class.

问题是您试图在匿名 class(即 variable = value)中分配变量。

由于匿名 classes 的实际工作方式,您不能这样做:当您编写匿名 class 时,外部范围的变量实际上是匿名 class 内部的字段=34=],即外作用域中的变量和匿名class中的变量实际上是不同的;您也不允许重新分配,以防止它们不同步。

另一方面,对于 Atomic*,您并不是在重新分配 变量 ,而是在重新分配它所拥有的值。这很好,因为匿名 class 内部和外部的任何变量仍然指向同一个 Atomic* 对象;而且,因为是同一个对象,所以两个地方都可以访问它的值。


首先,在排序时捕获异常似乎不是一个特别好的主意。会导致排序不一致、违反总合同等;而不是明显有用的有序列表。

如果你真的坚持,捕获sort调用外比较外的异常:

try {
  Collections.sort(list, new Comparator<JSONObject>() { ... });
} catch (JSONException | ParseException e) {
  exceptionMessage = "xyz";
  didJsonParsingFailed = true;
}

假设您真的不需要在 Comparator 内部捕获,那么写成这样会更容易:

Comparator.comparing(j -> new SimpleDateFormat(/* the date format */).parse(j.get(KEY_NAME)))

I was not able to understand the reason behind it.

原因是变量 exceptionMessagedidJsonParsingFailed 是从内部 class 访问的,需要是最终的或有效的最终的。

参考这个answer来理解final和effective final!

How does making it Atomic helps?

很简单,当您将其设为原子变量时,您修改的是原子变量中的内容,而不是 changing/assigning 对其的新引用!同样适用于 pojo class 以及将变量包装在一个简单的 pojo class 中,例如 OuterClassVariables,实例化它并使用它的设置器从内部 class 或 lambda 体。