yohhoyの日記

技術的メモをしていきたい日記

Java

汎用スコープガード in Java8

Java 8で導入されたラムダ式またはメソッド参照と、Java 7以降のtry-with-resources構文を組合せて、任意のオブジェクトに対するスコープガード処理を記述する方法。 // Java 7以降 class X implements AutoCloseable { // AutoCloseable#closeを実装したク…

java.io.UncheckedIOException例外クラス

Java 8で導入された java.io.UncheckedIOException 例外クラスについてメモ。Stream処理における “Exception Tunneling” のために追加された例外。UncheckedIOException例外クラスは、従来からある検査例外java.io.IOExceptionをラップする目的で、RuntimeEx…

メソッド参照と等価なラムダ式

Java 8で新たに導入されたメソッド参照(method reference)についてメモ。メソッド参照は下記の4種類に分類される。 [a] staticメソッドへの参照 [b] 特定オブジェクトのインスタンスメソッドへの参照 [c] 同一クラス任意オブジェクトのインスタンスメソッド…

java.util.concurrent.Phaser同期プリミティブ

Java 7で追加された java.util.concurrent.Phaser*1 同期プリミティブについてメモ。Phaser(フェイザー)クラスは、Java 1.5からあるCountDownLatchやCyclicBarrierを機能的に包含し、さらに汎用化したスレッド同期プリミティブである。CountDownLatch, Cyc…

Thread.destroyメソッド

Java標準ライブラリで提供されるThread.destoryメソッドについて。これまで一度も実装されることなく非推奨(deprecated)となった。常にNoSuchMethodErrorエラーを送出する。 @Deprecated public void destroy()Deprecated. This method was originally desig…

throw null;(Java編)

プログラミング言語Javaのthrow文に関するちょっとしたメモ。下記コードはコンパイルエラーとはならず、実際にはjava.lang.NullPointerExceptionオブジェクトが送出される。 throw null; // throw new NullPointerException();と等価 The Java Language Spec…

hashCodeメソッドのお手軽実装

Java 7以降ではユーティリティクラスjava.util.Objectsが追加されており*1、ユーザ定義クラスのhashCodeメソッド実装に利用できるヘルパメソッドjava.util.Objects#hash(Object...)を提供する。 class X { private int m1; private String m2; private Objec…

エルビス演算子(Elvis operator)

プログラミング言語Javaに対して、Project Coinで提案されていた エルビス演算子(Elvis operator)?:についてメモ*1。Groovy 1.5では同演算子が採用されており、GroovyからJavaへのフィードバック提案となっている。二項演算子の一種。左オペランドが非nullな…

Immutableクラスとfinalフィールドの関係

プログラミング言語Javaにて Immutable なクラスを実装する場合、同フィールドのfinal修飾が必要な理由についてメモ。Immutable オブジェクトを用いる利点の一つとして、自動的*1に保証されるスレッド安全性(thread-safety)が挙げられる。このような Immutab…

synchronizedは実装詳細である

プログラミング言語Javaにおけるsynchronized修飾されたメソッドでは、synchronizedはインタフェース*1(シグネチャ)の一部ではなく、そのメソッドの実装詳細に過ぎない。メソッドの実装に対する言及となるため、抽象メソッド(interfaceまたはclassのabstr…

\uuuu...の怪

プログラミング言語Javaにおけるソースコード上のUnicodeエスケープでは、バックスラッシュ(\)に続くuをいくつでも記述してよい。 String s0 = "\u65e5\u672c\u8a9e"; // "日本語" String s1 = "\uu65e5\uuu672c\uuuu8a9e"; // s0.equals(s1) == true The Ja…

Javaのconstキーワード

プログラミング言語Javaでは const をキーワードとして予約しているが、Java SE 7現在でも何ら特定の機能を持たない*1。(恐らく将来に渡って現状のままと予測される)1999年時点でJDK 1.2.0に対する機能拡張要求 BugID:4211070 Java should support const p…

文字列型のnull/空文字列判定

プログラミング言語JavaやC#では文字列型=参照型として定義されるため、空の文字列""と参照先なしnullは明確に区別される。一方で処理ロジックの “有効な文字列を保持しているか?” 確認のために、文字列型の変数に対して「nullまたは空文字列判定」が多用…

パスワードとString型

Javaプログラム上で高機密性情報(パスワード文字列など)を扱う場合、セキュリティ的にはjava.lang.Stringクラスよりchar型の配列char[]の方が好ましい。Java言語の文字列Stringインスタンスは不変(Immutable)なオブジェクトであり、メモリ上からデータ破棄…

(翻訳)良性データ競合は有害である

元記事:Benign Data Races Considered Harmful | Corensic, Bartosz Milewski氏, 2011/6/7自分自身の理解のために日本語訳を行ったC++11でのデータ競合に関する記事。(タイトルはいわゆる"〜 Considered Harmful"ネタ) 良性データ競合は有害である 最近、…

0xCAFEBABE

Javaクラスファイル(拡張子class)のマジックナンバー 0xCAFEBABE の由来について。 This reply is the actual answer to the question, supplied by Patrick Naughton, one of the original members of the team that eventually produced Java. I quoted …

条件変数とspurious wakeup

条件変数(condition variable)同期プリミティブにまつわる "spurious wakeup" についてメモ。安定した対訳語が存在しないようなので、本記事ではそのまま英語表記とする*1。spurious は “偽の; 疑似; 似非” といった意味の単語であり*2、wakeup は “条件変数…