Jersey ClientのRxサポートを軽〜く試す
Jersey 2.13がリリースされました。
リリースノートを見ると [JERSEY-2639] - Jersey Client - Add Support for Rx というのがあったので試してみましたん。
pom.xmlに突っ込むdependency
- jersey-rx-client-guava
- jersey-rx-client-java8
- jersey-rx-client-jsr166e
- jersey-rx-client-rxjava
があるっぽいですがRxJavaとかよく分かんないので今回はjava8で試します。
<dependency>
<groupId>org.glassfish.jersey.ext.rx</groupId>
<artifactId>jersey-rx-client-java8</artifactId>
</dependency>
クライアントコード
名前を渡したらこんにちは言ってくれるいつものリソースクラスがあったとします。
まずはふつうのJAX-RSクライアントのコード。
WebTarget target = ClientBuilder.newClient().target("http://localhost:8080/rest/hello");
String resp = target.queryParam("name", "world")
.request()
.get(String.class);
System.out.println(resp); //Hello, world!
うむ。普通。
次にRx板のコードです。
WebTarget target = ClientBuilder.newClient().target("http://localhost:8080/rest/hello");
CompletionStage<String> stage = RxCompletionStage.from(target)
.queryParam("name", "world")
.request()
.rx()
.get(String.class);
stage.thenAccept(s -> System.out.println(s)); //Hello, world!
ご覧の通り CompletionStage であれこれできるっぽいです。
まとめ
RxJava学ぼうかな。
ぬるぽ
あなたとぬるぽ。
拡張forループ
int[] xs = null;
for (int x : xs) {
}
配列・リストが null なら拡張forループでぬるぽっ!
アンボクシング
Integer x = null;
int y = x;
プリミティブラッパーをプリミティブにアンボクシングするときにぬるぽっ!
普通に数字の足し算とかしててぬるぽが出たらこれを疑います。
throw
UnsupportedOperationException e = null;
throw e;
null を throw したら投げられる例外はぬるぽっ!
String switch
String x = null;
switch (x) {
}
String のswitch文でぬるぽっ!
try with resources
try (AutoCloseable x = null) {
}
try with resourcesで AutoCloseable が null なら close するときにぬるぽっ!には ならない 。
close の前に null チェックするようにコンパイルされます。
コンストラクタ
new Hoge(a -> a.x.length());
何の変哲も無いコンストラクタですが、ぬるぽっ!になるケースがあります。
class Hoge {
final String x;
public Hoge(Consumer<Hoge> c) {
c.accept(this);
this.x = "hoge";
}
}
フィールド x はfinalなのにぬるぽになるというアレです。 コンストラクタ終わってないインスタンスはメソッドに渡さないでおきましょー。
メソッド実行
Hoge x = null;
x.foobar();
ぬるぽっ! にはならないケースがあります 。
これ。
class Hoge {
static void foobar() {
}
}
まあ実際はこんなコードに出会うことは無いでしょう。
無いでしょう。