2011-05-18 10 views
2

我正在執行中Map.Entry<K,V>V setValue(V value)方法,也做了以下w /返回從二傳手舊值O臨時變量:使用最後

@Override public T setValue(T value) { 
    try { 
    return this.value; 
    } finally { 
    this.value = value; 
    } 
} 

它的工作原理,因爲它應該。

我知道有一些關於finally塊和東西的問題,但我找不到這個具體的問題。什麼是你的關於這個特定用例的想法?這合法嗎?應該避免?如果是,那麼爲什麼或爲什麼不。謝謝!

+0

有趣的模式 - 混淆代碼。只有問題的標題告訴我們,代碼實際上在做什麼;)(老實說 - 我必須先閱讀Tom's和Jon的翻譯才能看到發生了什麼) – 2011-05-18 12:47:28

+0

注意:編譯器仍在創建一個臨時(隱藏)變量碼。 – 2011-05-18 13:19:39

回答

3

首選簡單明顯的代碼。即

@Override public T setValue(T value) { 
    T old = this.value; 
    this.value = value; 
    return old; 
} 

此外,這可以擴展爲[本地]線程安全(如NIO attach)。

private final AtomicReference<T> valueRef; 

@Override public T setValue(T value) { 
    return valueRef.getAndSet(value); 
} 
+0

'AtomicReference'的大量用法! – 2011-05-18 13:48:16

+0

@Psycho_Dad NIO實際上在'attach'中使用'AtomicReferenceFieldUpdater',因爲常用的用法是設置一次值並多次讀回。使用更新器意味着每個'SelectionKey'(??)不需要攜帶'AtomicReference'。 – 2011-05-18 14:15:43

3

它的工作原理,但它幾乎沒有明顯的(容易理解)爲:

@Override public T setValue(T value) { 
    T oldValue = this.value; 
    this.value = value; 
    return oldValue; 
} 

爲什麼不使用這種簡單的形式?

0

那麼,我認爲,目前來看,這是絕對合法的。通常情況下,你可以使用finally子句來指定在返回之前執行o的值。但有時候我們會使用放入返回的內容,並引發警告。我認爲你必須避免這種回報,但你可以使用終於休息。

否則,它就像是一個過時的函數,例如,無論你將這些賦值放在finally還是在try/catch塊之後。