Intellij IDEA 13:如何禁用重构注释和字符串?


89
public class KV<K, V> {
    public K key;
    public V value;
    public KV(K key, V value) {
        this.key = key;
        this.value = value;
    } 
}

我试图重构value发生在适当位置的类变量。这意味着没有对话框弹出。我按回车键,它将尝试在整个项目中重构,包括注释和不包括注释的内容,包括:

<%--<link href="<c:url value="../core/core.css" />" />--%>

在.jsp文件中。这太“聪明”了,无法尝试重构与整个项目匹配的注释。这通常会导致很多错误风险,并且在Java环境中进行重构已不再安全。

Intellij 12中也发生了同样的事情。严重的是,我不需要Intellij推荐任何不安全的东西,或者不确定它是否是同一件事!

我可以排除重构,但是我没有时间每次评估五个“建议”。它只是增加了人为错误的机会:大多数时候,我只按Enter键,然后将事情重构。

在Java环境中,有时它试图替换.js文件中的内容时,重构也是一个主要问题。严重的是,这必须停止。

没有弹出对话框,我无法取消选中“搜索字符串”。即使那是在打勾,应该的IntelliJ绝不包括默认的建议,特别是当它位于当前文件。它也可以建议对其进行重构,但是默认情况下应将其排除在外。也就是说,它应该是一种选择加入功能,而不是默认情况下破坏所有内容。

最近的所谓的“智能” Intellij重构是一个严重的用户体验问题。重构JS文件时,我不想在Java文件中搜索注释或字符串!期!反之亦然!

安全第一!知道自己在做什么的开发人员将在需要时自行搜索字符串。在动态语言环境中,它使Intellij无法使用,因为它经常且没有任何明确的模式,有时会进行重构,有时会更改项目中的所有内容,而不会更改其他内容。

应该有一个选项说:“仅相对于该文件或当100%推断时才重构!”,尤其是对于动态语言!对于静态语言,它甚至不应尝试在文件外查找注释和字符串。

我本不想公开发布,但是两年多以前我在bugtracker中提出了这个问题,但是没有人注意。

编辑

对于那些认为我可能会走得更远的人,我只是尝试了一下:

与这个班:

public class KV<K, V> {
    public K key;
    public V val;
    public KV(K key, V val) {
        this.key = key;
        this.val = val;
    }
}

并将其添加到任何Java类中,例如:

public class CoreConfig {
    String abc = "kv.val";
    String def = "somethingElse.val";
}

KV.val像以前一样重构时,我得到以下建议,灾难中的回车以及我必须一次评估并排除的一项内容。这需要付出努力,并且令人生厌且冒险。就像有人大喊大叫,停止!然后,一分钟,无奈和一篇1000篇长词的论文(this),一切都没有。

在此处输入图片说明

认真地说,有没有办法禁用这种冒险行为!?并且有没有任何理由为什么默认情况下启用此功能?

编辑20200706

狗屎将在2020年继续发生:https : //youtrack.jetbrains.com/issue/IDEA-245370


5
Intellij充满了强迫我的事情。如果android支持其他编辑器,我会跳动一下。我发现自己在与编辑战斗,而不是花时间编码。我在这里花费时间试图找到一种关闭事物的方法。大多数时候,他们不建议解决方案。他们大多数时候都在说...“您为什么讨厌这个功能?”
TatiOverflow

1
至少该功能应具有最小长度限制-就像我要重构具有通用3个字母名称的变量一样,默认情况下在字符串和注释中搜索并替换该变量的意义为零。如果这是一个大项目,那么这3个字母的序列很可能以随机字符串形式存在。啊。
Vicky Chijwani'2

1
现在它已经很普通了,只是坏了。它曾经是一个有意义的IDE。无法关闭这种可怕的默认行为使IntelliJ成为一种可怕的工具,我在不知不觉中通过简单地重命名像IntelliJ这样的变量使我难以忍受了多年,从而创建了看似无关的可怕bug。 t再也信任它的重构了-.-
yeoman

1
今天,它改变了Spring MVC POST映射的路径,因为我将类移到了另一个包(!!!!!!!)
yeoman

1
是的,这是intellij最糟糕的功能之一。如果我想重命名一个类,我最终可能会破坏整个项目,而该类名恰好出现在字符串中。因此,如果重命名该类UserMyUser它将重命名所有内容,包括配置文件,标签,URL,剩余调用映射中的路径...
ACV

Answers:


99

当您按Shift + F6 (Refactor Rename)两次时,它将打开对话框,您可以禁用“在注释和字符串中搜索”


9
要明确的是,这是激活“重构重命名” TWICE的快捷方式。根据您的键盘映射,它可能是不同的组合。
克里斯·埃里克森

4
谢谢,我看到您也可以禁用就地重构,尽管它很不错,因为那总是感觉很安全。我的帖子的重点是要强调指出,应该全局关闭对注释和字符串的搜索。它试图更改另一个类中变量的值是没有意义的。这不聪明。当智能或人工智能假设通过增加正确性的可能性而以某种方式允许误差范围时,就会出现问题。我想要严格的Java重构,除非整个包名称都存在,否则应该包括XML文件
mmm 2014年

1
但是由于它可以记住设置,所以我认为没有问题。您可以根据需要使用全文重构与否。
Meo 2014年

3
不幸的是,该复选框似乎不时地出现。有谁知道会永久关闭此设置的设置?正如之前提到的IntelliJ太“聪明”,以至于它本身没有好处...
Erk

@Meo并不是到处都尊重它。如今,JavaScript中的内联,incode文本重构正在修改代码中的值和注释,甚至在函数中也是如此。
mmm

8

并且有没有任何理由为什么默认情况下启用此功能?

就在这里。如今,人们倾向于使用太多的DSL,模板和语言注入。在普通的Java中,所有这些东西主要以字符串形式存在。反射API还将方法/类名称表示为字符串。任何IDE都不可能完全支持和识别它们,因此最好为您提供一个安全网,以防可能的重构错误。但是,如果您具有出色的单元测试覆盖率,那么这里可能很安全。

至于注释,它们通常包含代码示例。这些代码块在重命名期间很快就会过时,因此,当IDE提醒您它们的存在时,这将很有帮助。

当然,这种检查有时会导致误报。但是,如果给变量提供描述性的不言自明的名称(我不是说“ var”或“ val”),则这种情况不太可能发生。因此,IDE正在以某种方式推动您朝着更好的代码风格发展。

如果您仍然不确定,请遵循@Meo的建议并禁用字符串和注释中的搜索。


9
是的,这是一个很好的建议。但是正如我对他的评论一样,当智能或人工智能假设通过提高正确性的可能性而以某种方式允许误差范围时,存在一个问题。我想要严格的Java重构,除非整个包名称都存在,否则它应该包括XML文件,即使这样,我也希望得到通知。重构结果不应首先列出注释和字符串,并且默认情况下应排除。它变得不那么用户友好,并且需要我的专注,这迫使我向前倾斜并睁大眼睛。
mmm 2014年

2
这就像试图删除塞满的电话号码。您可以重复这个号码:392314213343234295423442吗?对我来说,这是同一种努力,当然对于其他许多人也是如此。我希望Intellij伙计们可以接机,并给我们选择关闭此功能的选项。
mmm 2014年

10
“但是,如果您具有出色的单元测试范围,那么您在这里可能会很安全” –这不是为我们提供将Java视为动态语言的IDEA的借口。如果我想使用动态语言,可以使用Groovy进行编码。“如果给变量提供描述性的不言自明的名称(我的意思不是“ var”或“ val”)”-碰撞的风险仍然存在。只需给我们一个“严格”的Java模式/选项,就像以前提供的Eclipse和Intellij。
mmm 2014年

5
一击,我将删除Symfony的框架。我们应该能够“默认排除”。
Nicolas Zozol 2014年

3
刚好碰到这个。绝对危险的默认设置,而且我犯了几次重命名“价值”之类的错误,并且没有立即注意到可能对项目造成的重大损害的错误。
Jilles van Gurp '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.