在内部 类 中访问的原子变量
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.
原因是变量 exceptionMessage
和 didJsonParsingFailed
是从内部 class 访问的,需要是最终的或有效的最终的。
参考这个answer来理解final和effective final!
How does making it Atomic helps?
很简单,当您将其设为原子变量时,您修改的是原子变量中的内容,而不是 changing/assigning 对其的新引用!同样适用于 pojo class 以及将变量包装在一个简单的 pojo class 中,例如 OuterClassVariables
,实例化它并使用它的设置器从内部 class 或 lambda 体。
所以我在这里进行排序并使用内部 class 实现 Comparator 接口,exceptionMessage 和 didJsonParsingFailed 是在内部 class 之外声明的变量,现在 java 没有允许使用内部 class 访问局部变量,所以这给了我一个错误,但是当我将这两个变量设置为原子变量时,“AtomicReference”和“AtomicBoolean”,在这种情况下程序运行正常,我无法了解其背后的原因。让它成为 Atomic 有什么帮助? java 是否允许访问内部 class.
中的 AtomicVariablesP.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.
原因是变量 exceptionMessage
和 didJsonParsingFailed
是从内部 class 访问的,需要是最终的或有效的最终的。
参考这个answer来理解final和effective final!
How does making it Atomic helps?
很简单,当您将其设为原子变量时,您修改的是原子变量中的内容,而不是 changing/assigning 对其的新引用!同样适用于 pojo class 以及将变量包装在一个简单的 pojo class 中,例如 OuterClassVariables
,实例化它并使用它的设置器从内部 class 或 lambda 体。