2009-04-24 46 views
4

在此代碼:如何在重寫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

我不想禁用這種警告,因爲它通常非常有用,而且我也不想有任何警告要麼具有較高的信噪比。

,因爲它是Java 1.4中只有我不能使用@SuppressWarnings()結構的另一個問題建議。

我想過插入空這樣的代碼,但它不是很理想:

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

@ an0nym0usc0ward:對不起,我一開始沒有提到警告是「innerValue is not read」。你的建議「innerValue = null」也不會讀取參數。 – 2009-04-24 17:11:14

回答

10

該警告是沒有問題的,我怕的設計。

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

當我遇到這種類型的的情況下,我創建一個名爲IMyX與讀取接口,一個名爲IMutableMyX與寫入子接口,然後實際的類實現IMutableMyX也因此而IMyX。我非常小心,只在需要時才通過IMutableMyX,在其他情況下通過IMyX。

我覺得最好是使用編譯器和類型來限制訪問,而不是計算運行時異常。它還使您的代碼更加清晰,並且在您希望寫入訪問時強制您明確地縮減界面。

我意識到這並不回答你關於擺脫警告的問題。但警告可以被壓制,忽視或解決。一個未使用的參數往往是一種難聞的氣味,表明你的方法可能沒有做到它所期望的。方法只應該獲得必要的參數。如果未使用該參數,則該參數不是必需的,因此需要更改某些參數。

0

我怕你堅持啞代碼。在C/C++,你可以使用宏(#define _unused(x) ((void) x)),但(void) variable;不是Java中的一個有效的語句。

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

+0

這回答了我的問題(所以+1來抵消-1),但Uri的回答更好,雖然在我的情況下並不嚴格適用(與標準java集合幾乎相同的pb:我沒有基類) – 2009-04-25 07:55:52

0

您可以安全地輸入如下行: innerValue = null; 位於函數的頂部,用於所有未使用的參數。 它不會影響調用者,但會保持編譯器的快樂。

+0

這不會被優化,但一個。不應該調用的方法的優化不是什麼大問題,並且b。它比「if(innerValue == null){}」更短。 – 2009-04-24 17:07:45

1

我不會玩任何「代碼技巧」,只是爲了讓編譯器警告消失,希望編譯器能夠優化技巧。事實上,這個編譯器警告所有有用的東西嗎?我只是禁用它。一旦使用Java 5,您可以使用@SuppressWarnings並重新啓用它。

國際海事組織,這是一個壞主意,讓所有可能警告,只是因爲他們的存在,然後設置了讓每一個警告消失。找出哪些警告實際上對您的環境有意義,並禁用其他警告。

+3

每個警告都是無用的,直到它向你展示你關心的事情。所以是的,這很有用。 :) – 2009-04-24 17:11:09

+0

看到#1的答案 - 事實證明,大多數警告是非常有用的,只是建議禁用一個編碼器不完全理解並不是一個很好的答案。對不起,-1:否則:( – 2009-04-24 18:36:39

0

如果您使用的是Eclipse(?),您可以打開Parameter Is Never Read警告,但忽略重寫和實現方法(這可以解決此特定問題)中的情況,以及單獨使用「@ param「標籤(儘管這當然不適用於Java 1.4)。我希望大多數其他Java IDE都具有類似的設置。

相關問題