[java/en] Added more info about Collections initialization (#4200)

This commit is contained in:
EgorBobrov 2021-08-22 21:21:01 +03:00 committed by GitHub
parent 4eaafe0839
commit 757ed9b49b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -510,10 +510,12 @@ public class LearnJava {
// toString returns this Object's string representation. // toString returns this Object's string representation.
System.out.println("trek info: " + trek.toString()); System.out.println("trek info: " + trek.toString());
} // End main method
private static class TestInitialization {
// Double Brace Initialization // Double Brace Initialization
// The Java Language has no syntax for how to create static Collections // Before Java 11, the Java Language had no syntax for how to create
// in an easy way. Usually you end up in the following way: // static Collections in an easy way. Usually you end up like this:
private static final Set<String> COUNTRIES = new HashSet<String>(); private static final Set<String> COUNTRIES = new HashSet<String>();
static { static {
COUNTRIES.add("DENMARK"); COUNTRIES.add("DENMARK");
@ -521,10 +523,10 @@ public class LearnJava {
COUNTRIES.add("FINLAND"); COUNTRIES.add("FINLAND");
} }
// But there's a nifty way to achieve the same thing in an // There's a nifty way to achieve the same thing,
// easier way, by using something that is called Double Brace // by using something that is called Double Brace Initialization.
// Initialization. private static final Set<String> COUNTRIES_DOUBLE_BRACE =
private static final Set<String> COUNTRIES = new HashSet<String>() {{ new HashSet<String>() {{
add("DENMARK"); add("DENMARK");
add("SWEDEN"); add("SWEDEN");
add("FINLAND"); add("FINLAND");
@ -535,8 +537,45 @@ public class LearnJava {
// is called when the anonymous inner class is created. // is called when the anonymous inner class is created.
// This does not only work for Collections, it works for all // This does not only work for Collections, it works for all
// non-final classes. // non-final classes.
} // End main method // Another option was to initialize the Collection from an array,
// using Arrays.asList() method:
private static final List<String> COUNTRIES_AS_LIST =
Arrays.asList("SWEDEN", "DENMARK", "NORWAY");
// This has one catch: the list we get is internally backed by the array,
// and since arrays can't change their size, the list backed by the array
// is not resizeable, which means we can't add new elements to it:
public static void main(String[] args) {
COUNTRIES.add("FINLAND"); // throws UnsupportedOperationException!
// However, we can replace elements by index, just like in array:
COUNTRIES.set(1, "FINLAND");
System.out.println(COUNTRIES); // prints [SWEDEN, FINLAND, NORWAY]
}
// The resizing problem can be circumvented
// by creating another Collection from the List:
private static final Set<String> COUNTRIES_SET =
new HashSet<>(Arrays.asList("SWEDEN", "DENMARK", "NORWAY"));
// It's perfectly fine to add anything to the Set of COUNTRIES now.
} // End TestInitialization class
private static class TestJava11Initialization {
// Since Java 11, there is a convenient option to initialize Collections:
// Set.of() and List.of() methods.
private static final Set<String> COUNTRIES =
Set.of("SWEDEN", "DENMARK", "NORWAY");
// There is a massive catch, though: Lists and Sets initialized like this
// 1) are immutable
// 2) can't contain null elements (even check for null elements fails)!
public static void main(String[] args) {
COUNTRIES.add("FINLAND"); // throws UnsupportedOperationException
COUNTRIES.remove("NORWAY"); // throws UnsupportedOperationException
COUNTRIES.contains(null); // throws NullPointerException
}
private static final Set<String> COUNTRIES_WITH_NULL =
Set.of("SWEDEN", null, "NORWAY"); // throws NullPointerException
} // End TestJava11Initialization class
} // End LearnJava class } // End LearnJava class
// You can include other, non-public outer-level classes in a .java file, // You can include other, non-public outer-level classes in a .java file,