所以我在這里做一個排序,用一個內類實作比較器介面,exceptionMessage和didJsonParsingFailed是在內類之外宣告的變數,現在java不允許用內類訪問區域變數,所以這給了我一個錯誤,但是當我把這兩個變數變成原子的,"AtomicReference "和 "AtomicBoolean",在這種情況下程式運行正常,我無法理解這背后的原因。把它變成原子的有什么幫助?java是否允許在內部類中訪問AtomicVariables?
P.S- 我必須在我的catch塊中修改這些變數,所以我不能把它變成final
。Collections.sort(list, new Comparator() {
private static final String KEY_NAME = "createdDateTime"。
@Override public int compare(Object o1, Object o2) {
字串str1。
字串str2。
Date d1 = new Date()。
Date d2 = newDate();
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"/span>;
didJsonParsingFailed = true;
}
return d1.compareTo(d2)。
}
});
uj5u.com熱心網友回復:
讓它成為原子式的有什么幫助?java是否允許在內部類中訪問AtomicVariables。
問題在于你試圖在一個匿名類中分配變數(即variable = value)。
由于匿名類的實際作業方式,你不允許這樣做:當你撰寫匿名類時,外部范圍的變數實際上是匿名類中的欄位,也就是說,外部范圍的變數和匿名類中的變數實際上是不同的;你不允許重新賦值,以阻止它們失去同步。
另一方面,對于 Atomic*,你不是在重新賦值 變數,而是在重新賦值它所持有的值。這很好,因為匿名類內部和外部的任何變數仍然指向同一個Atomic*物件;而且,由于它是同一個物件,兩個地方都可以訪問它的值。
在排序時捕獲一個例外,這似乎首先不是一個特別好的主意。它將導致不一致的排序,違反一般的契約等;而不是一個明顯有用的排序的串列。
如果你真的堅持,在sort呼叫之外的比較之外捕獲例外:
try {
Collections.sort(list, new Comparator<JSONObject> () { ... });
} catch (JSONException | ParseException e) {
exceptionMessage = "xyz"/span>;
didJsonParsingFailed = true;
}
假設你真的不需要在比較器內部抓取,那么它可以更容易地寫成:
Comparator. comparing(j -> new SimpleDateFormat(/* the date format */).parse(j.get(KEY_NAME))
uj5u.com熱心網友回復:
我不能夠理解它背后的原因。
它的原因是變數
exceptionMessage和didJsonParsingFailed是從內部類中訪問的,需要是final或有效final。參考這個答案來理解final和effective final!
讓它成為原子型有什么幫助?
簡單地說,當你把它變成原子時,你是在修改原子變數中的內容,而不是改變/分配一個新的參考給它! 同樣的方法也適用于pojo類,你可以將你的變數包裹在一個簡單的pojo類中,比如
OuterClassVariables,將其實體化并使用它的setters來設定內部類或lambda主體中的值。轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/310866.html
標籤:
上一篇:用條件對字符列進行排序/排列
