yohhoyの日記

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

Java

AutoClosable#closeメソッドのべき等要件

プログラミング言語Javaのtry-with-resources構文で用いるAutoClosableインタフェース仕様では、closeメソッドのべき等(idempotent)性は要求されない。(実装時には"べき等"が強く推奨される) void close() throws Exception Closes this resource, relinqu…

{void,value,both}-compatibleラムダ式

プログラミング言語Javaにおけるラムダ式は、その本体部に応じてvoid-compatible/value-compatible/その両方に区分される。void-compatibleラムダ式はRunnableなどの戻り値を持たない(void)関数型インタフェース(functional interface)へ、value-compatibl…

Math.min@浮動小数点数の実装

Java標準ライブラリMath.minメソッドの実装についてメモ。浮動小数点数型(float, double)に対するminでは、NaN(Not a Number)および負のゼロ(-0.0)を考慮する必要がある。*1 public static double min(double a, double b) { if (a != a) return a; // a is …

Is volatile useful with threads?

volatileキーワードはマルチスレッド処理に役立つ?.com(http://isvolatileusefulwiththreads.com/) C http://c.isvolatileusefulwiththreads.com/ C++ http://cxx.isvolatileusefulwiththreads.com/ Java http://java.isvolatileusefulwiththreads.com/ C…

Javaバージョン番号のひみつ

プログラミング言語Javaのバージョン番号付与ルールについてメモ。Java 1.0〜1.4までと、Java (SE) 5〜9ではバージョン番号の付与ルールが異なる。Java 5以降は一般に product version で呼称されるが、内部的には 1.N.0 のような developer version が付与…

Underscore As A Keyword

Java 9では1文字アンダースコア(_)はキーワード(keyword)に変更され、変数名などに利用するとコンパイルエラーになる。Java 8以前は非推奨の識別子(identifier)であり、コンパイル時の警告メッセージにとどまっていた。 class UAAK { public static void mai…

条件演算子と親クラスへの型推論(Java編)

プログラミング言語Javaにおける条件演算子(conditional operator) ?: と、子クラスから親クラスへの型推論(の一部)に関してメモ。条件演算子の第2, 3項目に親クラスParentから派生した子クラスChild1, Child2を指定した場合、Javaでは部分式 (b ? c1 : c2…

スーパークラスのprivateフィールドにアクセス

プログラミング言語Javaでは、スーパークラスのprivateフィールドはサブクラスへ継承(inherited by)されず、原則としてスーパークラス外部からはアクセスできない。ただし特定の条件下において、サブクラスからスーパクラスprivateフィールドへのアクセスが…

モニタ同期・待機処理と再帰ロックサポート

プログラミング言語Javaが提供するモニタ同期(synchronized構文)および待機処理(Object#wait)は、再帰ロックのセマンティクスをサポートする。*1メモ:待機処理でも再帰ロックをサポートする仕様は珍しい?C++標準ライブラリ(→id:yohhoy:20120802)やPO…

Lockインタフェースとtry-with-resourcesの相性

Java 7で導入されたtry-with-resources構文とLockインタフェースの関係について。Java標準ライブラリのロック処理ではAutoCloseableインタフェースを利用しないため、try-with-resources構文を利用した「変数スコープにもとづくロック獲得・解放処理(Scoped…

型推論と無限型(infinite type)

Java言語のジェネリクス(generics)では、型推論過程において無限型(infinite type)が推論されうる。ただしJava言語では無限型を表現できないため、非境界ワイルドカード(unbounded wildcard) を用いた再帰型(recursive type)で代替される。下記コードの条件…

複数例外catchの型推論

Java7で導入された複数例外 catch における型推論についてメモ。*1下記コードでの multi-catch 節における変数eの静的型は、Javaコンパイラの型推論によりException & CustomException型となる。つまりExceptionクラスとCustomExceptionインタフェースの両者…

HashMapコレクションの性能改善@Java8

Java8標準ライブラリのjava.util.HashMap<K,V>クラスでは、ハッシュ衝突時のパフォーマンス劣化を避けるために キー型K が Comparable インタフェースを実装することが望ましい。ただし、同インタフェースを実装しなくとも正常に動作する*1。 HashMapのインスタン</k,v>…

nullの型

Java言語におけるnullリテラルは、言語仕様上は null type をもつ唯一の値として扱われる。null type は名前のない特別な型であるため、Javaプログラム上で null type を直接扱うことはできない。Java Language Specification, Java SE 8 Editionより一部引…

オートボクシングと同一性比較の奇妙な振る舞い

Java言語において、オートボクシング(autoboxing)により生成されるプリミティブ型ラッパークラス・インスタンスの同値性/同一性について。注意:本記事は言語仕様の隅をつつく話題であり、大半のユースケースでequalsメソッドによる同値性判定が適切である…

空ストリームに対するallMatch/noneMatchはtrue

Java 8で導入されたStream APIに関して、空のストリームに対するallMatchおよびnoneMatch終端操作は常にtrueを返す。なお、空ストリームに対する anyMatchは常にfalseを返す。 // 整数値は偶数か? IntPredicate isEven = n -> (n % 2 == 0); IntStream.empt…

ConcurrentHashMap computeIfAbsent再帰呼び出しはNG

Java8で導入された java.util.concurrent.ConcurrentHashMap#computeIfAbsent メソッドでは、computeIfAbsentメソッドから呼出される計算処理中から、再帰処理によって同ConcurrentHashMapオブジェクトのcomputeIfAbsentメソッドを再度呼び出してはならない…

Double Brace Initializationイディオム

JavaコレクションやネストしたGUIコンポーネントを、1論理行っぽく初期化する方法。Double Brace Initializationイディオム(2重ブレース初期化)とも呼ばれる。 List<String> list = new ArrayList<String>() {{ add("foo"); add("bar"); add("zot"); }}; add(new JPanel() </string></string>…

.NET−Javaブリッジライブラリ

.NETクラスとJavaクラス間の相互運用を可能にするライブラリ。MITライセンス(本体)+GPLv3(ツール)。 http://jni4net.com/ https://github.com/jni4net/jni4net .NET CLRとJVMを同一プロセス内で動作させ、.NETクラスからProxyクラス経由でのJavaクラス…

CompletableFutureのキャンセル動作

Java8で追加されたjava.util.concurrent.CompletableFutureクラスとキャンセル動作について。 CompletableFuture#cancelメソッドは、実行中の非同期処理に割り込み(interrupt)キャンセルしない。 該当CompletableFutureが未完了の場合、CancellationExceptio…

java.util.concurrent.CompletableFutureクラス

Java8で追加された java.util.concurrent.CompletableFuture*1 クラスについてメモ。CompletionStage, Futureの両インタフェースを実装するクラス。Executorsフレームワーク(Java5以降)およびFork/Joinフレームワーク(Java7以降)の上で、Futureパターン*2に…

Comparator with ラムダ式

Java8で機能拡張されたjava.util.Comparator*1インタフェースについてメモ。コンパレータオブジェクトを生成・合成するstatic/defaultメソッドが追加された。 メソッド 機能 naturalOrder() (自然順序付け)コンパレータを生成 reverseOrder() (自然順序…

java.util.Comparatorは関数型インタフェース

Java 8のjava.util.Comparatorインタフェースは、その宣言からは2つのメソッドを持つようにみえるが関数型インタフェース(functional interface)である。 Comparator#equalsはObject#equalsメソッドのオーバーライドとして扱われ、Comparator#compareメソッ…

Stream APIの分類学

Java 8で導入されたStream APIの分類についてメモ。 ストリーム型 java.lang.streamパッケージでは4種類のインタフェースが提供される。いずれもBaseStream<T,S>インタフェースを継承する。 インタフェース 用途 Stream<T> T型ストリーム(ジェネリクス) IntStream </t></t,s>…

記事"AndroidのためのSMP入門"

Android Developers公式にて公開されているマルチスレッドプログラミング入門記事。主にARMアーキテクチャを対象として、ハードウェア・メモリモデルの理論的説明と、Java/C/C++プログラミングでの実践的な留意点に言及している。(題名に反して、Android固…

メソッドthrows節への非検査例外指定

プログラミング言語Javaの非検査例外(unchecked exception)とthrows節の関係についてメモ。メソッドthrows節で非検査例外を指定することは可能だが、メソッド呼び出し側でのコンパイル時チェックは行われない。*1 void func() throws NullPointerException {…

Initialization On Demand Holder idiom

プログラミング言語Javaにおけるスレッドセーフなシングルトン遅延初期化イディオム。Double-checked lockingイディオムと異なり*1、厳格なメモリモデルが定義されないJava 1.4以前でも正しく動作する事が保証されている。 public class Foo { private Foo()…

Curiously Recurring Generic Pattern

プログラミング言語Javaのジェネリクス(Generics)利用パターンに関するメモ。継承/実装する親クラス/インタフェースのジェネリクス仮型引数に、そのクラス/インタフェース自身を再帰的に渡せる。 → Cf.プログラミング言語C++でのCRTP(Curiously Recurring…

Stream API並列実行スレッドプールを明示指定

Java 8で導入されたStream APIの並列ストリーム処理において、実行するスレッドプールを明示指定する方法。Stream APIの既定動作では ForkJoinPoolの共通スレッドプール を利用する。*1 import static java.util.stream.IntStream.range; // 一般に論理プロ…

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

Java 8で追加された java.util.concurrent.locks.StampedLock 同期プリミティブについてメモ。まとめ: StampedLockクラスは、「楽観的(optimistic)Read操作」および「ロック昇格(upgrade lock)」を追加サポートしたReader-Writerロックとして機能する。 注…