`String.split(String)` and `Pattern.split(CharSequence)` have surprising
behaviour. For example, consider the following puzzler from
https://konigsberg.blogspot.com/2009/11/final-thoughts-java-puzzler-splitting.html:

```java
String[] nothing = "".split(":");
String[] bunchOfNothing = ":".split(":");
```

The result is `[""]` and `[]`!

More examples:

input    | `input.split(":")`  | `Pattern.compile(":").split(input)` | `Splitter.on(':').split(input)`
-------- | ------------------- | ----------------------------------- | -------------------------------
`""`     | `[""]`              | `[""]`                              | `[""]`
`":"`    | `[]`                | `[]`                                | `["", ""]`
`":::"`  | `[]`                | `[]`                                | `["", "", "", ""]`
`"a:::"` | `["a"]`             | `["a"]`                             | `["a", "", "", ""]`
`":::b"` | `["", "", "", "b"]` | `["", "", "", "b"]`                 | `["", "", "", "b"]`

Prefer either:

*   Guava's
    [`Splitter`](https://guava.dev/releases/23.0/api/docs/com/google/common/base/Splitter.html),
    which has less surprising behaviour and provides explicit control over the
    handling of empty strings and the trimming of whitespace with `trimResults`
    and `omitEmptyStrings`.

*   [`String.split(String, int)`](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#split\(java.lang.String,int\))
    or
    [`Pattern.split(CharSequence, int)`](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#split\(java.lang.String,int\))
    and setting an explicit 'limit' to `-1` to match the behaviour of
    `Splitter`.

TIP: if you use `Splitter`, consider extracting the instance to a `static`
`final` field.
