簡體   English   中英

在重寫java 1.4中的方法時如何避免“未使用的參數”警告?

[英]How to avoid the “unused param” warning when overriding a method in java 1.4?

在這段代碼中:

public class MyClass {
    private Object innerValue;
    public Object getInnerValue() {
        return this.innerValue;
    }
    public void setInnerValue(Object innerValue) {
        this.innerValue = innerValue;
    }
}

public class MyClassReadOnly extends MyClass {
    MyClassReadOnly(MyClass cls) {
        // Make a field by field copy
        super.setInnerValue(cls.getInnerValue());
    }
    public void setInnerValue(Object innerValue) {
        throw new UnsupportedOperationException(
                            "This is a read-only instance"
                        );
    }
}

編譯器正確地抱怨MyClassReadOnly.setInnerValue()中未使用的參數(從不讀取) innerValue

我不想禁用這種警告,因為它通常非常有用,而且我不希望任何警告要么具有高信噪比。

我不能使用@SuppressWarnings()構造作為另一個問題,因為它只是Java 1.4。

我想過插入像這樣的虛擬代碼,但它不是很令人滿意:

public void setInnerValue(Object innerValue) {
    if (innerValue != null) { /* Do Nothing, but keep the compiler happy */ }
    throw new UnsupportedOperationException("This is a read-only instance");
}

警告不是問題,我擔心的是設計。

您當前的層次結構違反了Liskov的替換原則,因為接收MyClass實例的類需要setInnerValue才能工作,並且可能無法正確處理此異常。 你可以說讀寫X是一種可讀的X,但你不能說可讀X是一種可讀寫的X.

當我遇到這種情況時,我創建了一個名為IMyX的接口,其中包含讀取,一個名為IMutableMyX的子接口和寫入,然后實際的類實現了IMutableMyX,因此也實現了IMyX。 我非常小心,只在需要時傳遞IMutableMyX,並在所有其他情況下傳遞IMyX。

我覺得使用編譯器和類型來限制訪問比計算運行時異常更好。 它還使您的代碼更加清晰,並強制您在需要寫訪問時明確地向下轉換接口。

我意識到這並沒有回答你關於擺脫警告的問題。 但警告可以被抑制,忽略或解決。 未使用的參數通常是難聞的氣味,表明您的方法可能沒有按照預期的方式進行。 方法應該只獲得必要的參數。 如果未使用該參數,則該參數不是必需的,因此需要更改某些內容。

我不會發揮任何“代碼技巧”只是為了讓編譯器警告消失,希望編譯器能夠優化掉技巧。 實際上,這個編譯器警告是否有用? 我會禁用它。 使用Java 5后,您可以使用@SuppressWarnings並重新啟用它。

IMO,啟用所有可能的警告是一個壞主意,因為它們存在,然后着手讓每一個警告都消失。 找出哪些警告實際上對您的環境有意義並禁用其余警告。

我擔心你會遇到虛擬代碼。 在C / C ++中,您可以使用宏( #define _unused(x) ((void) x) ),但是(void) variable; 不是Java中的有效語句。

如果它讓你感覺更好,編譯器可能會優化掉空的if塊。

您可以安全地輸入如下行: innerValue = null ; 在所有未使用的args的函數頂部。 它不會影響調用者,但會讓編譯器滿意。

如果您正在使用Eclipse(?),則可以啟用“參數從不讀取”警告,但忽略覆蓋和實現方法(可以解決此特定問題)的情況,以及單獨使用“@param”標記記錄的情況(雖然當然不適用於Java 1.4)。 我希望大多數其他Java IDE都有類似的設置可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM