ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[Java] assert文の構文

 
Java の assert文の文法は次のとおり。
AssertStatement

assert Expression1 ;
assert Expression1 : Expression2 ;
したがって
assert(f);
というのはメソッドを呼び出しているわけではない。
(f) という boolean式を assert の後ろに書いているだけ。
  1. 2012/04/21(土) 16:03:56|
  2. Java|
  3. トラックバック(-)|
  4. コメント:0

[Java] NavigableSet の floor と ceiling のイメージ、覚え方

 
NavigableSet の floor と ceiling の振る舞いを、
「引数を基準としてコレクションからそれに該当する要素を抽出する」と捉えるよりも
「引数 → 切り捨て(切り上げ)られた値」という引数に対する計算と捉えた方が
数値計算の floor と ceiling の感覚と近くなり、メソッド名のイメージをより理解しやくなると思う。

フロアは、NavigableSet集合の順序構造において引数を切り捨てる。
シーリングは、NavigableSet集合の順序構造において引数を切り上げる。

以下のイメージ図を見比べれば覚えやすい。

数値計算の floor と ceiling


数値計算の floor と ceiling のイメージ

NavigableSet の floor と ceiling


NavigableSet の floor と ceiling のイメージ

シーリングはシーリング・ライトのシーリング。
  1. 2012/04/20(金) 15:34:01|
  2. Java|
  3. トラックバック(-)|
  4. コメント:0

[Java] FileクラスのrenameToメソッドは新しい名前をオブジェクトに反映できない。

 
renameTo メソッドに渡される新しい名前は、File オブジェクトに反映されない。
File f = new File("foo");

f.renameTo(new File("bar"));
を実行して renameTo が成功したとしても f.getName() は "foo"を返す。
これは Java の仕様。
JavaのFileクラスは不変(immutable)クラスという点に関する注意点

以下、検証用コード。
参考までに言うと Eclipse はデフォルトではアサーション機能が有効になっていない。
import java.io.*;


public class TestFileRenameTo {
public static void main(String[] args) throws IOException {
File a = new File("foo");
File b = new File("bar");
a.createNewFile();
b.delete();
assert a.exists() && !b.exists();
if (a.renameTo(b)) {
assert !a.exists() && b.exists();
assert a.getName().equals("foo");
System.out.println(a.getName());
}
}
}

  1. 2012/04/07(土) 07:34:25|
  2. Java|
  3. トラックバック(-)|
  4. コメント:0

[Java] Java 型理論の記号のまとめ

 
「Java 言語仕様 第3版」の「4.10 サブタイピング(P.59)」に記述されている記号については以下のとおり。
class A {}

class B extends A {}
class C extends B {}
を例にして説明する。

記号 >1 は、直接的な継承関係を示す。
例)
A >1 B
B >1 C

記号 :> は、直接および間接的な継承関係を示す。
例)
A :> A
A :> B
A :> C
B :> C

S :> T であり、S ≠ T である場合 S > T である。
例)
A > B
A > C
B > C

と示せる。

二重不等号については「15.12.2.7 実引数に基づく型引数の推論」に記述がある。

P.396
U << V という表現は,型 U がメソッド起動変換(§5.3)によって型 V へと変換可能であるということを意味し,
U >> V は,型 V がメソッド起動変換によって型 U へと変換可能であるということを意味している
変換の方向と記号の方向が逆になっていることに注意。
  1. 2012/04/04(水) 19:02:40|
  2. Java|
  3. トラックバック(-)|
  4. コメント:0

[Java] Queue を LIFO のスタックとして使う

 
『プログラミング言語Java第4版』の 21.7 Queue には次のような記述があります。
キューは、たいていは先入れ先出し(first-in-first-out)順序で操作しますが、後入れ先出し(last-in-first-out)順序(スタックと呼ばれます)[...]も可能です。
Queues often operate on a first-in-first-out ordering, but it is also possible to have last-in-first-out ordering (commonly known as a stack) or to have a specific ordering defined by a comparator or by comparable elements.Each implementation must specify its ordering properties.
この言明はおそらく 「Queue インタフェースは、取り出される要素の順序が FIFO か LIFO であるかは規定していない。そのセマンティクスは実装によって決定される」ということを言っているのでしょう。

さて、実際に Queue インタフェースをスタックとして利用するには、どのようにすればよいのでしょうか。
Java SE6 では、Collections の static メソッド asLifoQueue を使えばいいようです。

LIFO キューとして振る舞う Queue オブジェクト

Java SE6 では、SE6 で新たに導入された Deque(デック)インタフェースをLinkedList が実装しており、Collections クラスに次のような static メソッドが追加されています。

public static <T> Queue<T> asLifoQueue(Deque<T> deque)

使用例:
Queue<String> stack = Collections.asLifoQueue(new LinkedList());
  1. 2012/04/03(火) 10:17:57|
  2. Java|
  3. トラックバック(-)|
  4. コメント:0
次のページ