-
Notifications
You must be signed in to change notification settings - Fork 0
API Examples
This document details the basic use cases of Unchecked Java.
Let's say we were defining a private static final
url field. You may start with the following:
private static final URL GOOGLE_NEWS = new URL("https://news.google.com");
Your IDE would quickly inform you about an uncaught exception. The problem is that new URL
throws a MalformedURLException
which is a checked-exception. At this point most people just revert to using a String
:
private static final String GOOGLE_NEWS = "https://news.google.com";
In the grand scheme of things, this works just fine, with the likely risk that you'll create multiple redundant URL news = new URL(GOOGLE_NEWS)
instances in different parts of your code. But what if you wanted to enforce a singleton URL instance?
private static final URL GOOGLE_NEWS;
static {
try {
GOOGLE_NEWS = new URL("https://news.google.com");
} catch (final MalformedURLException e) {
throw new AssertionError(e); // cannot happen
}
}
This is perfectly functional if not cumbersome and verbose. Using Unchecked Java we can accomplish this with a single line of code:
private static final URL GOOGLE_NEWS = uncheckedGet(() -> new URL("https://news.google.com"));
Don't forget to import static software.leonov.common.util.function.CheckedSupplier.uncheckedGet;
Note
Even if an error occurs initializing a static field, we are not worried about circumventing Java's exception handling mechanisms with Unchecked Java because all class initialization errors will be suppressed under a java.lang.ExceptionInInitializerError
.
Java's functional interface types are not compatible with lambdas that throw checked exceptions. Consider the following example:
final List<URL> resources = Stream.of("https://www.google.com", "https://www.yahoo.com").map(URL::new).collect(Collectors.toList());
The Stream.map
method accepts a java.util.function.Function
object whose apply
method does not throw a checked exception. We are forced to refactor the code and rethrow the MalformedURLException
as a RuntimeException
in order to get it to compile:
final List<URL> resources = Stream.of("https://www.google.com", "https://www.yahoo.com").map(t -> {
try {
return new URL(t);
} catch (final MalformedURLException e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toList());
With Unchecked Java the example above can be re-written in a compact and concise manner:
final List<URL> resources = Stream.of("https://www.google.com", "https://www.yahoo.com").map(evalUnchecked(URL::new)).collect(Collectors.toList());
This time we import static software.leonov.common.util.function.CheckedFunction.evalUnchecked;
Let's look at another example. Suppose you want to sort files according to their size in bytes:
final List<Path> files = ...
files.sort(Comparator.comparingLong(value -> {
try {
return Files.size(value);
} catch (IOException e) {
throw new RuntimeException(e);
}
}));
With Unchecked Java we can write:
final List<Path> files = ...
files.sort(evalUnchecked(comparingLong(Files::size)));
This time we have to import static software.leonov.common.util.function.CheckedComparator.evalUnchecked;
and import static software.leonov.common.util.function.CheckedComparator.comparingLong;