8

在我的一个 Android 项目中(但不一定与 Android 相关联),我有很多方法调用,它们实际上什么都不做,只会破坏代码并且可以自动删除。例子:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return super.onKeyDown(keyCode, event);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return super.onCreateOptionsMenu(menu);
}

@Override
public void onDestroy() {
    super.onDestroy();
}

我找不到任何可以帮助我自动删除这些表达式的检查,所以我尝试了结构搜索。到目前为止我的尝试:我复制了“注释方法”的模板并进行了 2 处小改动。

  1. $Annotation$ 更改为发生=1,文本=覆盖
  2. 添加了一个 $Statement$ 变量,其发生=1

模板代码:

class $Class$ {
    @$Annotation$( )
    $MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
        $Statement$;
    }
}

到目前为止,一切都很好 - 它只在正文中找到具有单行的方法。但现在我想明确搜索调用超级方法的确切语句(有点像对 $MethodName$ 的反向引用),但它也返回超级值(当不是 void 时)。有任何想法吗?

我相信这将是一个非常有用的检查,也可以集成到主要的 IntelliJ 代码库中。:-)

4

2 回答 2

9

所以我最近发现 IntelliJ 的“空方法”检查实际上是在寻找这个。简单地:

Double Shift -> 按名称运行检查 -> 空方法

方法只调用它的超

概要是“方法只调用它的超级”,但检查实际上寻找的不仅仅是这个,例如:

  • 该方法及其所有派生项都是空的
  • 此方法的所有实现都是空的
  • 方法为空
  • 空方法覆盖空方法

根据您的情况,它可能会找到比您想要的更多的东西 - 并且重构试图删除比我实际想要的更多的东西。但是通过快速的手动审查,你应该很高兴。:-)

于 2015-08-02T19:47:35.397 回答
1

使用结构搜索,您将不得不使用两个单独的搜索。一种用于查找具有 void 返回类型的方法:

class $Class$ {
    $MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
        super.$MethodName$($ParameterName$);
    }
}

第二个用于返回值的方法:

class $Class$ {
    $MethodType$ $MethodName$($ParameterType$ $ParameterName$) {
        return super.$MethodName$($ParameterName$);
    }
}

在这种情况下,不需要指定@Override注释。

于 2015-08-04T13:10:50.823 回答