2009-04-24 48 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都具有类似的设置。

相关问题