简体   繁体   中英

Is there a way to refactor a Set initialization to use Set.of() using IntelliJ?

Is there a way to refactor this in IntelliJ (or even with Eclipse), to transform the first script to the second one :

Set initialization before Java 9 :

Set<String> values = new HashSet<>();
values.add("a");
values.add("b");

Set initialization starting from Java 9 (creates an immutable set) :

Set<String> values = Set.of("a", "b");

The refactoring option may not be available in all the cases (the source set should be unmodifiable).

However IntelliJ has inspections that may be more suitable to detect such a case.

See under Java > Java language level migration aids > Java 9 : Immutable collection creation can be replaced with collection factory call :

This inspection helps to convert unmodifiable collections created before Java 9 to new collection factory methods like List.of or Set.of . Also since Java 10 the conversion to List.copyOf , etc. could be suggested.

Note that Java 9 collection factory methods do not accept null values. Also set elements and map keys are required to be different. It's not always possible to statically check whether original elements are different and not null. Using the checkbox you may enforce the inspection to warn only if original elements are compile-time constants, so the conversion is guaranteed to be correct.

This inspection is available since Java 9 only.
New in 2017.2

This inspection can be tested with this code :

Set<String> stringSet = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c")));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM