What’s New in IntelliJ IDEA 2016.2 for Spring Developers

If you’re a heavy user of Spring and IntelliJ IDEA, you’ll find the IntelliJ IDEA 2016.2 update very interesting. Besides many important bugfixes, the update adds support for Spring 4.3 and Spring Security 4.0 features and cache abstraction, improves support for Spring MVC, and further tunes performance. Before reading about this in more detail, make sure you’ve registered for our webinar dedicated to the new release and Spring framework.

OK, now back to the update. First of all, the IDE now supports generics types as qualifiers and provides navigation for them:

Also, the IDE now supports custom @EventListener annotations defined with @AliasFor and enables coding assistance for editing SpEL:

The new inspection helps replace field injection with constructor injection:

The IDE now supports Spring Cache abstraction: CacheResolver, CacheManager, KeyGenerator, @Cachable, @PutCache, @EvictCache, etc. The support includes code completion, navigation, inspections and syntax highlighting.

The icon on the gutter (the narrow panel on the right-hand side of the editor) lets you navigate to other methods annotated with cache operations related to the same name:

A dedicated inspection checks if a cache name is provided for all cache-related operations:

If you use a @Cachable annotation on an interface or, e.g. put @Cachable and @CachePut on the same method, you’ll see a warning.

And of course, the IDE provides coding assistance for editing SpEl:

In FreeMarker and Velocity templates, you’ll get code completion and navigation for variables defined in Spring MVC controllers:

Also, the update has supported the changes introduced with Spring Security 4.0 and added code completion and navigation for SpEl in annotations and inside XML:

And last but not least, we’ve added highlighting and navigation for Spring-related messages in Console.

Found this interesting? Download the update and give it a try right away.

P.S. Oh, and we’re going to SpringOne Platform event in the beautiful Las Vegas. If you also plan to attend, come and listen to the Tips and Tricks for Spring in IntelliJ IDEA talk, by Yann Cébron and Stéphane Nicoll!

 

Develop with Pleasure!

Posted in New Features | Tagged , , | 1 Comment

Java 8 Top Tips

I’ve been working a lot with Java 8 code over the last couple of years, for both new applications and migrating existing ones, and it feels like the right time to write down some of the “best practices” I’ve found useful. I personally dislike the term “best practices” as it implies a “one size fits all” solution, and of course coding doesn’t work that way – it’s down to us as developers to figure out what will work in our situation. But I have discovered I have particular preferences for Java 8 code that I find makes my life a little easier, and I thought I’d start a discussion on this topic.

Optional

Optional is a highly underrated feature, and one that has the potential to remove a lot of those NullPointerExceptions that can plague us. It’s particularly useful at the boundaries of code (either APIs you’re using or APIs you’re exposing) as it allows you and your calling code to reason about what to expect.

However, applying it without some thought and design can lead to one small change impacting a large number of classes, and can lead to poorer readability. Here are some tips on how to use Optional effectively.

Optional should only be used for return types
…not parameters and not fields. Read this blog post to see a pragmatic approach to using Optional. Fortunately, IntelliJ IDEA lets you turn on an inspection to check you’re following these recommendations

Optional Parameter Warning

Optional values should be dealt with in the place they’re encountered.  IntelliJ IDEA’s suggestions will prevent Optional leaking all over your code, so remember you should deal with Optional where you found it and move swiftly on.

Deal with Optional immediately

You should not simply call get()
The strength of Optional is to express that this value might be empty, and allow you to cater for that case. Therefore, it’s important to check if there is a value before doing anything with it.  Simply calling get() without checking isPresent() first is likely to lead to a null pointer at some point. Fortunately, once again IntelliJ IDEA has an inspection to warn you to stick to this.

Get without isPresent

There is probably a more elegant way
The isPresent() combined with get() certainly does the trick…

Simplest use of Optional

…but there are more elegant solutions. You can use orElse to give an alternative value in the case that it’s null

Using Optional orElse

…or you can use orElseGet to tell it which method to call in the case that the value is null. This might seem the same as the above example, but the supplier method will be called only if needed, so if it’s an expensive method, using the lambda will give you better performance.

Using Optional orElseGet

Using Lambda Expressions

Lambda expressions were one of the main selling points of Java 8.  Even if you’re not using Java 8 yet, you’ve probably got basic understanding of them by now. But they are a new way of programming within Java, and it’s not yet obvious what is “best practice”. Here are some guidelines I like to follow.

Keep it Short
Functional programmers may be happy with longer lambda expressions, but those of us who’ve been using only Java for many years might find it easier to keep lambda expressions to a small number of lines. You might even prefer to limit them to just a single line, and you can easily refactor longer expressions into a method.

Extract longer lambda expressions into methods

These may even collapse down into method references. Method references may seem a bit alien at first, but it’s worth persevering with them as they can actually aid readability in some cases, which I’ll talk about later.

Collapse Lambda to Method Reference

Be Explicit
Type information is missing for lambda expressions, so you may find it useful to include the type information for the parameter.

Explicit parameter types for lambda expressionsAs you can see, this can get quite unwieldy.  So I prefer to give my parameters a useful name. Of course, whether you do this or not, IntelliJ IDEA lets you see type information of parameters.

See the parameter types of the lambda

and even the Functional Interface the lambda represents

See the lambda's functional interface

Designing for Lambda Expressions

I think of lambda expressions as being a little like Generics – with Generics, we use them regularly (for example, adding type information to List<> ), but it’s much more rare that we’ll design a method or a class that has a Generic type (like a Person<T>). Similarly, it feels like we’ll pass lambdas around when using things like the Streams API, but it’ll be much more rare for us to create a method that requires a lambda parameter.

However, if you do find yourself in this situation, here are some top tips.

IntelliJ IDEA can help you introduce a functional parameter
This lets you create a parameter where someone will pass in a lambda rather than an Object. The nice thing about this feature is that it suggests an existing functional interface that matches the specification.

Extract functional parameter

Which leads to…

Use existing functional interfaces
As developers become more familiar with Java 8 code, we’ll know what to expect when using interfaces like Supplier and Consumer, and creating a home-grown ErrorMessageCreator (for example) could be confusing, and wasteful. Take a look at the function package to see what’s already available.

Add @FunctionalInterface to your functional interface
If you really do need to create your own functional interface, then tag it as such with this annotation.  It might not seem to do much, but IntelliJ IDEA will show you if your interface doesn’t match the exceptions for a functional interface. It flags when you haven’t specified a method to override:

Functional interface without a method

it flags when you’ve specified too many:

Functional interface with too many methods

and it warns you if you’ve applied it to a class rather than an interface:

Functional interface that's actually a class

Lambda expressions can be used for any interface with a Single Abstract Method, but they can’t be used for abstract classes that meet the same criteria.  Seems illogical, but it is what it is.

Streams

The Stream API is another one of the big selling points of Java 8, and I think we still don’t really know how much this is going to change (or not) the way we code. Here’s a mixed bag of things I’ve found useful.

Line up the dots
I personally prefer to line up my stream operations. You don’t have to, of course, but I’ve found this helps me:

  • see which operations I have, in order, at a glance
  • debug more easily (although IntelliJ IDEA does offer the ability to set breakpoints on any of multiple lambda expressions on a line, splitting them onto separate lines does make it simpler)
  • comment out an operation while I’m testing things
  • easily insert a peek() for debugging / testing

Line up your dots

Also it’s neater, in my opinion. But we don’t gain a lot in terms of reducing lines of code if we follow this pattern.

You may need to adjust your formatting settings to get the dots lined up.

Formatting Stream method chaining

Use Method References
Yes, it does take a while to get used to this weird syntax. But when used correctly, it really adds to the readability. Consider

Stream using a simple logical filter

verses the use of the helper methods on the (fairly) new Objects class:

Stream with method reference

This latter code is much more explicit about which values it wants to keep.  IntelliJ IDEA will usually let you know when a lambda can be collapsed to a method reference.

Use method reference instead of lambda expression

When iterating over a Collection, use the Streams API where possible
…or the new collections methods like forEach.  IntelliJ IDEA can suggest this to you:

Replace iteration with forEach

Generally using the Streams API is more explicit than a combination of for loops and if statements.  For example:

Using traditional iteration

IntelliJ IDEA suggests this can be refactored to:

Using the Streams API

The performance tests I’ve done show that this sort of refactoring can be surprising – it’s not always predictable whether performance will stay the same, improve, or get worse. As always, if performance is critical in your application, measure it before committing to one style over another.

Use for loops when looping over arrays
However, using Java 8 doesn’t necessarily mean you have to use streams and new collections methods everywhere. IntelliJ IDEA will suggest things that can be converted to streams, but that doesn’t mean you have to say “yes” (remember inspections can be suppressed or turned off).

In particular, iterating over a small array of primitive types is almost definitely going to be better performance with a for loop, and probably (at least while Java developers are new to streams) more readable.

For loops are faster over arrays

As with any of the tips, this rule is not set in stone, but you should decide whether you are going to prefer using the Streams API where you can, or whether you’re still going to use loops for some operations.  Above all, be consistent.

Finally

I’ve written a similar but complimentary post on this topic for the Upsource blog, containing these tips and more things to look out for in Java 8 code when you’re performing a code review.

I’m discovering new things every day, and sometimes my preferences change – method references, for example, I used to hate, and avoided having them in my code. I’d love to hear your top tips!

Posted in Tips & Tricks | Tagged , | 24 Comments

IntelliJ IDEA 2016.2.1 EAP updates Kotlin support to 1.0.3

Great news! IntelliJ IDEA 2016.2.1 is on the horizon. You’re welcome to give its first EAP build a try. In addition to the usual dose of bugfixes, this EAP build updates the bundled Kotlin plugin version to 1.0.3. Here’s a little more insight into what it brings you.

If you’ve ever pasted Java code into a Kotlin file, you’ve probably noticed that IntelliJ IDEA offers to automatically convert it to Kotlin. However, this used to work only if the code was copied from inside the IDE. Now it works no matter where you got the code, even if it is a StackOverflow page.

Code completion for Kotlin also got better. IntelliJ IDEA suggests non-imported members and adds an import statement automatically on selection. Smart Completion is available after by and in statements.

The Move Element Left/Right actions, which were added earlier for Java, now work for Kotlin.

And finally, the Kotlin Bytecode tool window now has a Decompile button.

For more details read the announcement in the Kotlin blog.

As always, we appreciate your feedback here in the comments as well as in our issue tracker.

Develop with Pleasure!

Posted in EAP Releases, New Features | Tagged , , , | 1 Comment

Live Webinar: What’s New in IntelliJ IDEA 2016.2

We hope you’ve already tried IntelliJ IDEA 2016.2 which we released earlier this week. Even if you haven’t, we’re offering a deeper insight into its new features Wednesday, July 27th, 12:00 PM – 1:00 PM EDT (New York) / 18:00 – 19:00 CEST (Berlin) (check other time zones) during a live webinar What’s New in IntelliJ IDEA 2016.2, featuring Trisha Gee.

intellij_idea_webinar_2016_2

In this webinar Trisha will give you an overview of the most important changes of 2016.2 and, of course, will answer your questions.

Register now!

Speaking to you

Trisha GeeTrisha has developed Java applications for a range of industries, including finance, manufacturing and non-profit, for companies of all sizes. She has expertise in Java high performance systems, is passionate about enabling developer productivity, and dabbles with Open Source development. You can follow her on Twitter – @trisha_gee


The Drive to Develop

Posted in Webinars | Tagged , | Leave a comment

Java Annotated Monthly – July: Java Tools and Technologies

Whether you like to branch out into other JVM languages, or prefer to get deep knowledge in “classic” Java, there’s always more to learn in our Java-flavoured world.  This issue aims to give you some summer holiday reading. But the most exciting news this month is a double-whammy: IntelliJ IDEA is the top IDE, according to the latest Developer Productivity Report, and we have a new version of IntelliJ IDEA!

JavaAnnotatedMonthly@2x

Continue reading

Posted in News & Events | Tagged | 5 Comments

IntelliJ IDEA 2016.2 is Here!

The last four months passed quickly, yet they were very productive. Today we give you IntelliJ IDEA 2016.2, our second update in the series of this year’s releases. As usual, it brings both useful new features and important fixes. Read on to learn what kept us busy and download the update to try all of its new features without any further ado.

IntelliJIDEAult_splash20162@2x

Continue reading

Posted in New Features, Releases | Tagged , | 86 Comments

IntelliJ IDEA 2016.2 RC is Out

Time flies! The IDE update planned for this summer is now a matter of days. Today’s good news is that we’ve published its first RC build. You’re very welcome to download it and give a thorough try to all of its new features.

We appreciate your feedback on bugs and other flaws you may find in the build. Report them without hesitation to our issue tracker.

Develop with Pleasure!

Posted in EAP Releases, Release Candidates | Tagged , | 2 Comments

IntelliJ IDEA 2016.2 EAP Adds Breadcrumb for Java

Fresh IntelliJ IEA 2016.2 EAP build is out and ready. Among the usual bugfixes it also brings something special: Breadcrumbs for Java code.

Until now breadcrumbs were only available in HTML and XML code, where they have proven to be super handy for tracking of the editing position as well as traversing the tag tree. Now breadcrumbs work for Java, too, where instead of tags they let you navigate through classes, lambda expressions and methods:

To enable this feature, go to SettingsEditor → General → Appearance and select Show breadcrumbs.

Your thoughts and impressions about this and any other changes are very welcome here in the comments, and, of course, in our issue tracker.

Develop with Pleasure!

Posted in EAP Releases, New Features | Tagged , | 17 Comments

Webinar Recording: Refactoring with IntelliJ IDEA

Last week we had two exciting events: IntelliJ IDEA 2016.2 Public Preview announcement, and a webinar in which Bill Wake gave a one-hour masterclass on refactoring with IntelliJ IDEA.

The preview is definitely worth a try, so please help yourself to it (don’t forget to share your feedback, of course.) As for the webinar, you’re welcome to watch its recording any time:

Sources of the original Gilded Rose application can be found on GitHub, as are sources of the same application after all the refactoring.

To learn more about refactoring code and IntelliJ IDEA, read this article on DZone, and of course, check out the IntelliJ IDEA official page, for there are links to articles and tutorials on this topic.

And finally, you may want to have a look at Code Katas, a free interactive exercise by Industrial Logic, our Training & Consulting Partner. This exercise lets you practice Test-Driven Development, refactoring, and other programming skills in Java. Katas not only checks your stats, but also provides you with personalized feedback as you progress through it.

About the presenter

Bill WakeBill is best known in the Agile community as the creator of the INVEST model for user stories and the Arrange-Act-Assert guideline for unit tests. He has been an author of several books on XP, refactoring and design patterns. You can follow him on Twitter @wwake

Develop with Pleasure!

Posted in Tips & Tricks, Webinars | Tagged | 3 Comments

IntelliJ IDEA 2016.2 Public Preview

We’re excited to announce that IntelliJ IDEA 2016.2, the next IDE update awaited this summer, is now available for public preview! To get all the details about its new features and to download the preview build, proceed to our website.

Here’s a list of most notable changes:

  • Debugger
    • The Watches and Variables views in the Debugger tool window have been merged together.
  • VCS
    • The Log viewer for Git and Mercurial got faster and now has a handy loading progress indicator.
    • Patches are much easier to apply, especially if the files have been changed since the patch was created.
    • Case-only renames now work well in Git for Windows and OS X.
  • User interface
    • The Editor supports monospaced fonts with ligatures: e.g. FiraCode, Hasklig, Monoid or PragmataPro.
    • Any image can be set as the background of the Editor and the IDE Frame.
  • Spring Frameworks
    • Support for the Spring 4.3 and Spring Security 4.0 features.
    • Coding assistance for the Cache Abstraction.
    • Improved performance (for projects with many XML files; and several simultaneously opened projects).
  • JavaScript
    • Intentions to convert code to ES6.
    • Better coding assistance for React.
    • Smarter support for TypeScript’s enum types.
  • Database Tools
    • Code completion is now more context-aware.
    • Code completion for column values inside the Table Editor.
    • Better PostgreSQL support.
  • Android
    • Android Studio 2.0 features (except Instant Run, not fully merged yet).
  • Other
    • The Windows installer bundles a custom JDK with fixes for focus and font rendering issues.

Give it a try

You’re very welcome to download the preview build and give all its new features a spin. If you do, please do share your impressions with us here in the comments or directly in our issue tracker.

Develop with Pleasure!

 

 

Posted in Beta Releases, New Features | Tagged , | 4 Comments