I decided to publish code to Maven central providing extended version of this blog's sample code. And I have become fascinated with gitflow. So I am stirring the pot, mixing git, github, maven and the central repo. Wish me luck. I'll post a "howto" when it works well enough.
Friday, August 30, 2013
Quick tour of Java 8
Bienvenido David III provides a quick tour of Java 8 in Everything About Java 8.
Rebooting Jigsaw redux
Alex Blewitt has interesting observations on the next reboot of Jigsaw, the project to modularize the JDK, in Jigsaw, Second Cut. Amusing bit:
There has been a module system available for Java from the early days, known as JSR 8 and more recently as OSGi and JSR 291, that is used by all major Java EE application servers, and many other systems and applications in wide use today (JIRA, Eclipse) as well as specific vertical markets (embedded systems, home automation). Jigsaw follows in the footsteps of design successes such as
java.util.Date
, JavaIONIONIO2NIO2.2 and thejava.logging
package, and aims to ignore best practices to developer an inferior system for use by the JDK itself.
Ultimately he hopes for OSGi-lite.
Thursday, August 29, 2013
Netflix contributes RxJava
Somehow I missed this earlier: Functional Reactive in the Netflix API with RxJava by Ben Christensen. It begins:
Our recent post on optimizing the Netflix API introduced how our web service endpoints are implemented using a "functional reactive programming" (FRP) model for composition of asynchronous callbacks from our service layer.
This post takes a closer look at how and why we use the FRP model and introduces our open source project RxJava – a Java implementation of Rx (Reactive Extensions).
Sunday, August 25, 2013
Providing failure policy with generics and annotations
Java generics with annotations provides a simple technique for specifying failure policies in an API. The exception in a throws
clause may be a generic parameter. The @Nullable
and @Nonnull
annotations express intent.
In the example, Base
takes an Exception
as a generic parameter. Three implementations demonstrate the choices:
ReturnsNull
is for "finder" type APIs, where anull
return is in good taste.ThrowsUnchecked
is when failure is fatal, and should be handled higher in the stack.ThrowsChecked
is when failure is transient, and can be handled by the caller (e.g., network failures).
Because the exception is defined at a class level, this technique is best for SAM-style APIs or when a common exception is shared by a few calls.
static void main(final String... args) { new ReturnsNull().returnSomething(); System.out.println("Returned null"); try { new ThrowsUnchecked().returnSomething(); } catch (final RuntimeException ignored) { System.out.println("Threw unchecked"); } try { new ThrowsChecked().returnSomething(); } catch (final Exception ignored) { System.out.println("Threw checked"); } } interface Base<E extends Exception> { Object returnSomething() throws E; } final class ReturnsNull implements Base<RuntimeException> { @Nullable @Override public String returnSomething() { return null; } } final class ThrowsUnchecked implements Base<RuntimeException> { @Nonnull @Override public String returnSomething() { throw new RuntimeException(); } } final class ThrowsChecked implements Base<Exception> { @Nonnull @Override public String returnSomething() throws Exception { throw new Exception(); } }