20个IntelliJ IDEA重构功能

12年前
Out-of-the-box support for languages and frameworks

The first and perhaps the most impressive aspect of refactorings in IntelliJ IDEA is its all-encompassing support for languages and frameworks. It not only recognizes many languages, expressions and dialects (even nested inside each other), but also their relationships within the project.

You can safely call refactorings for any statement at the caret, and IntelliJ IDEA will take care of applying the corresponding changes to every piece of code related to the change. This includes SQL expressions; database table definitions; Spring expressions and annotations and configurations; JSF expressions; hibernate mappings; and more.

For instance, you call the Rename refactoring on a class within a JPA statement. IntelliJ IDEA recognizes that you need to rename a JPA entity class, and applies changes to the class and every JPA or other expression in the project — in mere seconds.

20个IntelliJ IDEA重构功能

Undo

Another aspect that changes the user experince significantly is how safe and easy you can undo any change resulting from even a complicated refactoring, with just one click. Don’t be afraid to apply changes, because you can always roll them back!

Find and replace code duplicates

Another thing that makes some developers think IntelliJ IDEA understands their code as well as they do (or better), is detection of code duplicates. This feature is available as a separate refactoring, which you can call on any project scope, and as a part of any other refactoring, such as introduce constant, variable, method, etc. Just apply the refactoring and IntelliJ IDEA willmake appropriate changes to your code to remove duplicates. Try it just once—and you’ll wonder how you’ve lived without it all along.

20个IntelliJ IDEA重构功能

Rename and name patterns recognition

What could be simpler than the Rename refactoring, you ask? Well, IntelliJ IDEA offers incredible additional support for this refactoring. When you use it, the IDE offers to apply the corresponding changes to getters and setters, variables, constants, test classes and methods, implementation classes, etc. This can be a huge time-saver and a lot of help in keeping your code clean

20个IntelliJ IDEA重构功能

Type migration

Another useful feature you will rarely find in other IDEs is type migration. Have you ever used some type for a long time and then decided to change it? I’m sure you have.

IntelliJ IDEA takes care of automatically applying changes to method return types, local variables, parameters and other data-flow-dependent type entries across the entire project. You can even switch between arrays and collections, and the IDE will make all the changes for you.

20个IntelliJ IDEA重构功能

Invert boolean

If we can automate type migration, why not do the same with semantics? Exactly. For example, IntelliJ IDEA can correctly invert all usages of a boolean member or variable.

20个IntelliJ IDEA重构功能

Safe delete

As I hinted earlier, the real benefits of refactoring are always in the details. IntelliJ IDEA tries to keep things simple for you, but there’s a lot intelligence lurking behind every feature. Even with simple deletion, it ensures that not a single line of code gets broken.

20个IntelliJ IDEA重构功能

String fragments

Yet another time saver not found in other IDEs. IntelliJ IDEA can even extract a part of a string expression. Just select the fragment you need, and the IDE will take care of the rest.

20个IntelliJ IDEA重构功能

Other productivity-boosting features

Many other refactorings in IntelliJ IDEA also include productivity-boosting features.

For instance, you can easily change the type of extracted variable (or parameter) via ⇧⇥, just in-place, as well as replace all occurrences or declare it final.

20个IntelliJ IDEA重构功能

If you extract a field, the IDE will prompt you to choose where you want to initialize it. If you do it within a test, it will suggest that you initialize it in a setUp method.

20个IntelliJ IDEA重构功能

Inline to anonymous

Everyone is used to inlining methods. However, not everyone knows that IntelliJ IDEA also provides inline refactoring for constructors. This is especially useful for such classes as Thread or Runnable. After you call it, all usages will be inlined into anonymous classes.

20个IntelliJ IDEA重构功能

Clone class

The Clone class refactoring is yet another example of how something so simple can still save your time.

20个IntelliJ IDEA重构功能

As most other refactorings, it is available from a usage and helps you create a copy of any class you need.

Encapsulate fields

This feature is quite simple and is present in most IDEs. It helps you encapsulate fields with one click. IntelliJ IDEA goes a bit further: it can do it for a whole class at once.

20个IntelliJ IDEA重构功能

Consistent behavior

Most Java refactorings in IntelliJ IDEA are also available from non-Java files where references to Java classes exist. Since it comes with out-of-the-box support for many custom frameworks, it offers the same shortcuts and consistent behavior for all refactorings.

20个IntelliJ IDEA重构功能

Framework specific refactorings

In addition to Java refactorings, IntelliJ IDEA offers refactorings specific to custom frameworks, such as Spring, Java EE, Android, etc.

For example, you can easily morph any component of an Android application into another type, right from the designer.

20个IntelliJ IDEA重构功能

Framework-specific refactorings are a wide-ranging topic that’s probably out of the scope of this article. I hope to cover it later, as well as refactorings specific to other languages, such as Scala, Groovy, JavaScript, CSS, and XML.

Additional refactorings

The total number of refactorings available in IntelliJ IDEA is quite high. There are about 35 Java only refactorings, plus a large number of refactorings specific to other frameworks and languages. Whichever definition of refactoring you use, it’s got more of them than any other Java IDE.

Here’s a list of just the unique ones

  • Make static
  • Inline super class
  • Replace inheritance with delegation
  • Extract method object
  • Remove middleman
  • Wrap return value
  • Move instance method
  • Convert to instance method
  • Replace temp with query
Refactor this

If you cannot recall the shortcut for a particular refactoring, or if you don’t feel like using the mouse, IntelliJ IDEA offers Refactor this action available via ⌘⇧⌥T. It shows you the list of refactorings applicable at the current context.

20个IntelliJ IDEA重构功能

Structural replace

The last feature for today is Structural replace available via ⌘⇧M. This is a very powerful tool, but also the least obvious.

Thank to its advanced code analysis, IntelliJ IDEA knows pretty much everything about your code. This makes possible Structural replace, which lets you use language-specific tokens in lookup and replace expressions.

For example, we have a library with a new version where a static method was replaced with a singleton. To update our code, we can use the following structural replace expressions:

com.ij.j2ee.MakeUtil.$MethodCall$($Params$) for lookup and  com.ij.j2ee.MakeUtil.getInstance().$MethodCall$($Params$) for replace.

IntelliJ IDEA will find, resolve and replaces all usages correctly, regardless of how the class was imported.

Structural replace can be rather complicated at first, but once you learn how to use it, it can save you a lot of time.

Summary

I hope this article helps you to discover the powerful refactoring functionality hidden in IntelliJ IDEA. The more you know about your IDE, the more time it can save you every day, and the more productive you become. Go ahead and get the most out of your IntelliJ IDEA!