在IntelliJ IDEA 2017.2.6中,我有以下Java类。
public class EinzUnregisterResponseMessageBody extends EinzMessageBody {
private final String username, reason;
public EinzUnregisterResponseMessageBody(String username, String reason){
this.username = username;
this.reason = reason;
}
/**
* @return the body as JSONobject, ready to be included as "body":{this returned Object} in a message
*/
@Override
public JSONObject toJSON() throws JSONException {
return new JSONObject("{\"username\":\""+this.username+"\"," +
"\"reason\":\""+this.reason+"\"}");
}
public String getReason() {
return reason;
}
public String getUsername() {
return username;
}
}
IntelliJ通常以浅灰色显示未使用的属性。在这个课程中,它只会变灰getReason()
。
有意义的是它不会使构造函数或字段变灰。方法toJSON()
在抽象超类EinzMessageBody
中定义,因此必须存在,所以这也不是灰色的。
getReason()
永远不会被使用,因此变得灰暗。 但为什么getUsername()
没有变灰?
当我右键单击它并选择查找用法时,IntelliJ会报告没有找到用法。
我知道this question,但是运行分析>检查代码和分析>按名称运行检查>未使用的属性似乎没有任何对此有影响。也没有重新启动IDE。
使高速缓存无效并重新启动首先重置显示,以便不会显示任何内容,但是一旦完成索引,突出显示将再次相同。
超类EinzMessageBody
仅指定toJSON()
,而getReason()
和getUsername()
均未指定。
getReason()
和getUsername()
之间的区别是什么?
关于@HonzaZidek的评论:
删除extends EinzMessageBody
和注释@Override
不会改变任何内容。
创建一个完全空的项目并仅粘贴此类,而EinzMessageBody
除了toJson()
方法外,所有内容都显示为灰色。这是预期的,因为我现在没有实例化类 - 因此构造函数显示为灰色,getReason()
和getUsername()
的行为相同(都是灰色的)。
当我将类移动到不同的子包时,这仍然可以正常运行,就像它们在我的实际项目设置中一样。
当我实例化类时,这仍然按预期运行:构造函数停止显示为灰色,getReason()
和getBody()
仍然正确显示为灰色。
我刚刚拉上笔记本电脑(而不是桌面电脑),同样的行为也在那里发生。
我还搜索了getUsername()
的其他子类EinzMessageBody
的任何用法,并找到了一个。{1}}。删除此内容并未将getUsername()
中的EinzUnregisterResponseMessageBody
更改为灰色。
This answer建议运行分析>按名称运行检查>未使用声明,因为出于性能原因,IntelliJ可能无法检查常用名称。这会将getReason()
和getUsername()
列为未使用,但显示样式保持不变。
答案 0 :(得分:1)
我担心,正如您所怀疑的那样,智能内置于IntelliJ Idea中。您可以在JetBrains's Issue Tracker中将其报告为错误或功能请求 - 至少可以选择关闭优化。
根据现有答案https://stackoverflow.com/a/32049386/2886891和https://stackoverflow.com/a/40870673/2886891,我在Settings
|下添加对IntelliJ Idea说明的引用Editor
| Inspections
| Java
| Declaration Redundancy
| Unused declaration
:
在编辑器内突出显示期间,可能不会报告某些未使用的成员。由于性能原因,只有在项目中很少出现其名称时才会检查非私有成员。