为何IntelliJ IDEA比Eclipse好在哪里?
本文为译文,编译:Albert 原文:https://dzone.com/articles/why-idea-better-eclipse
争论
有一些没有唯一正确答案的“永恒”的问题,例如,更好的是:Windows还是Linux,Java和C#谁更强大:Chuck Norris好还是Van Damme好。
其中的一个Holy War便是Java和IDE的选择:
有许多争论的话题是讨论它们哪个有更多的插件、快捷键等等。它们之间有太多的不同而很难决定什么才是最重要的。
因此,很多人都表示两个IDE在功能上都差不多,选择哪一个全是个人喜好的问题。
我认为这不仅仅是个人喜好的问题,有客观的原因能表明:Intellij IDEA 肯定比 Eclipse 更好。
我不会去大量比较两者细微不同,例如插件与快捷键之类的。因为有一系列的blog是关于这些的。我将会展示IDEA与Eclipse的一个最大的不同之处。这是大多数IDEA和Eclipse的拥护者都不曾了解的。
对于IDEA的拥护者,他们已经习惯性的使用着它,而不曾想象IDE缺少了这些会怎样,后者则没有使用它的习惯,所以难以想象有了它IDE能做得这么好。Eclipse的用户在使用IDEA的时候通常都不会意识到这个不同点,因为他们习惯了以Eclipse模式工作。
为何我如此确信?
在开始说明之前,让我解释一下我是谁和为什么我的观点值得一听。
我使用Eclipse已经5年之久,我很了解它,我为它编写插件并真心地喜爱它。然后,我换了一个公司工作,并被强行转移到IDEA上开发,在这次“分手”后,我才最终意识到为什么IDEA更加敏锐。而如今我也已经使用IDEA一些年了,所以我有资格比较它们两者,因为我很熟悉了解它们。
IDEA与Eclipse主要的不同
IDEA之所以更加敏锐的原因是:IDEA懂得上下文。这也是JetBrains员工命名IDEA为intelligent的原因。它真正的含义又是什么呢?
IDEA检索你整个的项目,分析项目里所有的内容,甚至构建语法树。幸亏有它,在任何时候无论你将鼠标放置在任何地方,IDEA都知道你在哪里并知道在那儿能干些什么。
仍旧不明白?别担心,在列举了以下几个例子后,一切就都清楚了。
这种对上下文的理解表现在很多很多方式上,以下只是其中的一部分。
1、调试
通常在调试过程中,我们想要求一些表达式的值,在Eclipse中你需要选择这个表达式,选择整个表达式非常重要,否则你就没法求出它的值。然后,你可以使用Ctrl+Shift+I看到这个表达式的值。
使用IDEA你不需要选择任何东西,你只需要把光标移到你的表达式中然后按下Alt+F8。IDEA会很好的理解这个你可能需要的表达式,然后显示一个对话窗口,其中有一些它给出的建议参数变量。你也可以进行编辑,并在对话框中立即将得到这个表达式的值。相当的方便!试过这个特性后,我相信你就不会再想在Eclipse中调试了。
在两个IDE上做同样的事,但是使用IDEA会更加简单和快速。我认为,这个差异太大了:就像天堂跟人间一样。在一个小小的IDEA对话窗口中就提供了自动完成,语法高亮以及你需要的一切。
2、自动完成
自动完成使得IDE比notepad更加优秀,在这个领域能感知上下文的IDEA有了质的飞跃。例如,我们开始如下一行代码:
assertElement(By.id("errorMessage"), vi
现在我们想要查找以vi开头的选项有哪些。
IDEA怎么做的呢?无需等待任何的按键,它马上就能理解assertElement需要一个Conditaion类的示例作为第二个参数,而在Condition类中有一个静态变量名叫visible。IDEA会直接建议这个唯一的有效选项。
然而,Eclipse会怎么做呢?唉,它不能理解上下文,它不知道光标所在处就是assertElement方法的第二个参数。因此当你按下“神圣”的Ctrl+Space时,Eclipse只会简单的显示全局中以vi字母开头的一切。
在一个美丽的弹出框中,我看到了很多漂亮的高亮格式的无用的信息。:(
3、重构
专业的程序员能够高效的使用IDE提供的重构功能。所有的现代IDE都提供许多令人印象深刻的重构功能。但是还是那句话,IDEA的重构功能最聪明智能。它们能读懂你需要什么,然后针对不同的情况提供给你最适合的解决方案。
例如,假设我们有一个assertErrorMessageIsHidden方法:
public void assertErrorMessageIsHidden() {
assertElement(By.id("errorMessage"), Condition.visible);
}
我们以字符串“errorMessage”作为该方法的一个参数。
让我们先从IDEA开始,将光标放在任何字符串“errorMessage”上,按Ctrl+Alt+P(代表“parameter”),IDEA将会建议我们可能可以在哪些表达中用次字符串为参数。
当“errorMessage”表达式被选定以后,IDEA将会建议一些可能的能用做该参数的变量名称。
不时的惊喜
你会经常地惊讶于IDEA的智能表现,比如它为你提示一些选项的名称。它考虑到方法名称,变量类型甚至是变量值,以及其他的例如:此类变量的名称,与之前你给定的此变量的名称。相信我,你会想说“Wow,IDEA也能这样?”,我想说至少每个月一次吧。
现在让我们看看Eclipse是怎么样给出建议的。
别忘了,选择整个"errorMessage"表达式哦。选择一个“推荐参数”的重构功能(通过菜单,没有什么快捷键可供使用),获得差不多相同的结果,然而,Eclipse不会给出变量名提示选项,但幸亏不会。
结论
如果我们选择Java IDE,那么Intellij IDEA要比Eclipse好这是肯定的。这不仅仅是个人喜好问题。从客观上看,IDEA更好。它使你能够更加快捷地编写和修改代码。它给出恰当的名称提示,查找适合的方法。它不需要你特别地选择表达式便会猜测到你想要做的以及你想如何对它命名。IDEA预示着并给你提示。
P.S. Remarks
我认为IDEA在作为Java IDE时确实比Eclipse更好。如果你考虑他们其他方面的能力例如用于其他例如C++、Python、Scala的IDE上,或者是作为构建桌面的应用的平台,Eclipse很有可能拔得头筹。
事实上这是依赖于对他们的定义的,Eclipse已将自己定位为一个抽象平台,用来使用插件构建任何工具,而IDEA则定位为一个“智能的Java IDE”,而且它正是如此做的。
作为纪念我就尝试着例举一些Eclipse可能比IDEA更好的地方:
- Eclipse拥有更强的项目结构支持。在IDEA中,你的项目是有模块组成。在Eclipse中你拥有一个由工程组成的工作区,每个工程都能被单独打开或关闭,分组或隐藏。但是你真的需要么?
- 为Eclipse编写插件似乎很简单。
- IDEA比Eclipse使用更多的系统资源。这其实也说得通--因为IDEA做得更多。
- 最后,Eclipse是免费的,然而IDEA Community版本已经够我用了。
最后的建议
如果你需要漂亮的图标,用来创建桌面程序的平台,C++IDE或者你用的是一个低配的笔记本工作,那么Eclipse可能对你来说是更好的选择。但是如果你是一个正儿八经的Java开发者,你需要更快更方便的工具帮你集中注意于解决问题而不是让你分心,IDEA则正是你所需要的。
- ASP.NET AJAX(4)__客户端访问WebService服务器端释放WebService方法客户端访问WebService客户端访问PageMethod错误处理复杂数据类型使用基础客户端代理的
- 讲真,你该做备份的有效性校验了
- memcache安装方法
- 设计模式专题(五)——工厂方法模式
- ASP.NET AJAX(11)__ScriptManagerUpdatePanel的支持成员功能控制成员脚本控件支持成员ScriptMode和ScriptPathLoadScriptsBeforeU
- SQL Server 2016新特性:动态数据屏蔽(DDM)
- ASP.NET AJAX(12)__浏览器兼容功能判断浏览器的类型和版本Sys.Browser针对DOM元素的兼容操作针对DOM事件的兼容操作
- 设计模式专题(六)——原型模式
- ASP.NET AJAX(13)__利用Microsoft AJAX Library开发客户端组件Sys.Component成员Sys.IDisposable成员Sys.INotifyDisposin
- 设计模式专题(七)——建造者模式
- ASP.NET AJAX(14)__UpdatePanel与服务器端脚本控件脚本控件的作用脚本控件的指责Extender模型脚本控件和Extender模型在PostBack中保持状态在UpdatePa
- ASP.NET AJAX(15)__构建高性能ASP.NET AJAX应用UpdatePanel的性能问题使用UpdatePanel的注意事项脚本加载避免脚本阻塞页面显示AjaxControlTool
- LINQ to SQL(1):基础入门
- 设计模式专题(十)——观察者模式
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- vue中子组件使用$emit传值的种种情况
- 前端工程化建设
- 机器学习101-从JAX的角度去实现
- Spring 系列之jdbcTemplate的使用
- 【Linux_Shell 脚本编程学习知识点、判断传入参数是否是 整数】
- 发现一款.NET Core开源爬虫神器:DotnetSpider
- 完整的卸载Jdk java环境教程
- HTML 元素标签语义化及使用场景
- 共享内存原理与VCS监控采集实战
- Spark中的聚类算法
- 【Linux_Shell 脚本编程学习笔记六、shell的数值运算】
- Java自动化测试(adb常用命令 32)
- 前端学习计算机理论知识的好处
- 【Vue 学习笔记 一、Vue开发环境搭建】
- Vue 图片上传组件(base64 版):vue-upload-imgs