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

mom*_*omo 84 intellij-idea

public class KV<K, V> {
    public K key;
    public V value;
    public KV(K key, V value) {
        this.key = key;
        this.value = value;
    } 
}
Run Code Online (Sandbox Code Playgroud)

我试图重构类变量value,它发生在适当的位置.这意味着没有弹出对话框; 我按回车键,它会尝试在整个项目中进行重构,包括评论和不包含的内容,包括:

<%--<link href="<c:url value="../core/core.css" />" />--%>
Run Code Online (Sandbox Code Playgroud)

在.jsp文件中.这太巧妙了,试图重构整个项目中匹配的评论.这通常会导致很多bug风险,并且在Java环境中进行重构不再安全.

在Intellij 12中也发生了同样的事情.说真的,我不需要Intellij推荐任何被认为不安全的东西,或者当它不确定它是同一个东西时!

我可以排除重构,但我没有时间每次评估五个"建议".它只是增加了人为错误的可能性:大多数时候我只是按下回车键,然后重写事物.

当有时尝试替换.js文件中的内容时,重构也是Java环境中的一个主要问题.说真的,这必须停止.

没有弹出对话框,我无法取消勾选"搜索字符串".即使那是在打勾,应该的IntelliJ 绝不包括默认的建议,特别是当它是当前文件之外.它也可以建议重构它们,但默认情况下应排除它们.也就是说,它应该是一个选择加入功能,而不是默认销毁所有内容.

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

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

应该有一个选项,说"仅重构相对于此文件或100%推断!",特别是对于动态语言!对于静态语言,它甚至不应该尝试在文件外部查找注释和字符串.

我并不是故意将其公之于众,但我在2年前曾在bugtracker中提出过这个问题,但是没有人注意到.

编辑

对于那些认为我可能会走得很远的人,我只是尝试了这个:

有了这个课程:

public class KV<K, V> {
    public K key;
    public V val;
    public KV(K key, V val) {
        this.key = key;
        this.val = val;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public class CoreConfig {
    String abc = "kv.val";
    String def = "somethingElse.val";
}
Run Code Online (Sandbox Code Playgroud)

KV.val像以前一样重构时,我得到了以下建议,一个来自灾难的输入以及我必须评估的东西,并且一次排除一个.这需要努力,只是烦人和冒险.这就像有人大喊大叫,停!然后噢,一分钟之后没什么,挫折和一篇1000长的文章(这个).

在此输入图像描述

说真的,有没有办法禁用这种危险行为!?是否有任何理由为什么这是默认的?

Meo*_*Meo 92

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

  • 要明确的是激活"重构重命名"TWICE的快捷方式.根据您的键映射,它可能是不同的组合. (9认同)
  • 谢谢,我看到你也可以禁用inplace refactor,虽然它很好,因为它总是感觉像是安全的.我的帖子的要点是强调应该全局关闭对注释和字符串的搜索.它试图改变另一个类中变量的值是没有意义的.这不聪明.当智能或人工智能假设通过增加正确的可能性时,存在一个问题,它在某种程度上被允许有误差.我想要严格的java重构,除非存在整个包名,否则应该包含XML文件 (4认同)
  • 不幸的是,复选框似乎偶尔会重新出现.有没有人知道会永久关闭它的设置?正如之前所提到的,IntelliJ对于它自己的好处来说太"聪明"了...... (2认同)

Jk1*_*Jk1 8

是否有任何理由为什么这是默认的?

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

至于评论,它们通常包含代码示例.这些代码块在重命名期间很快就会过时,因此当IDE提醒您存在时,它会很有用.

当然,这种检查有时会导致误报.但是,如果您为变量提供描述性的自解释名称(我的意思不是"var"或"val"),则不太可能发生这种情况.因此,IDE正在以某种方式推动您走向更好的代码风格.

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

  • "如果你有一个很好的单元测试覆盖率,那么你可能在这里安全" - 这不是为我们提供一个将Java视为动态语言的IDEA的借口.如果我想要一个动态语言,我会在Groovy中编写代码."如果你给你的变量描述性的不言自明的名字(我的意思不是"var"或"val")" - 碰撞的风险仍然存在.只需给我们一个"严格"的Java模式/选项,比如Eclipse和Intellij曾经提供的. (10认同)
  • 是的,这是一个很好的建议.但正如我对他所评论的那样,当情报或人工智能假设通过增加正确的可能性时,它会有一个问题,它会以某种方式被允许有误差.我想要严格的java重构,除非整个包名存在,否则应该包含XML文件,即使这样,我也希望得到通知.重构结果不应首先列出注释和字符串,默认情况下应排除.它变得不那么用户友好了,需要我的注意力迫使我向前倾,使我的眼睛疲劳. (9认同)
  • 一次错误点击,我将删除Symfony的框架.我们应该能够"默认排除". (5认同)
  • 刚刚碰到这个.绝对危险的默认,我犯了错误,重命名"价值"之类的东西几次,并没有立即注意到可以对项目造成的史诗损害. (3认同)
  • 这就像试图取下一个塞满的电话号码.你能否重复这个数字:392314213343234295423442?对我来说,这是同样的努力,对许多其他人来说肯定是这样.我希望Intellij的人们能够接受并给我们选择关闭它. (2认同)
  • IntelliJ只是想在我的GPL 3许可中将“实体”替换为“实例”。非常有帮助,非常感谢。 (2认同)