gpt4 book ai didi

java - 在 java 1.4 中覆盖方法时如何避免 "unused param"警告?

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:01 25 4
gpt4 key购买 nike

在这段代码中:

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是一种readable-X,但你不能说一个readable-X是一种read-and-writable X。

当我遇到这种情况时,我会创建一个用于读取的名为 IMyX 的接口(interface),一个用于写入的名为 IMutableMyX 的子接口(interface),然后实际类实现 IMutableMyX,因此也实现 IMyX。然后我非常小心地只在需要时传递 IMutableMyX,并在所有其他情况下传递 IMyX。

我觉得使用编译器和类型来限制访问比依靠运行时异常要好。它还使您的代码更加清晰,并强制您在确实需要写访问权限时显式向下转换接口(interface)。

我意识到这并不能回答您关于消除警告的问题。但是可以抑制、忽略或处理警告。未使用的参数通常是一种难闻的气味,表明您的方法可能没有按照预期的方式进行。方法应该只获取必要的参数。如果不使用该参数,则该参数不是必需的,因此需要更改某些内容。

关于java - 在 java 1.4 中覆盖方法时如何避免 "unused param"警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/786740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com