日々常々

ふつうのプログラマがあたりまえにしたいこと。

Java7 体当たり/Binary Literals, Underscores in Number Literals

数値系は2つまとめて。

二進数表記

Binary Literals
16進数の 0x の様に、2進数を 0b で書けるようになります。地味に便利かもしれませんね。勿論二進数なので 0 と 1 以外の数を入れるとコンパイルエラーになります。

// いままで
byte j6byte = (byte)21;
// こう書ける
byte j7byte = 0b10101;

// これはコンパイルエラー
byte error = 0b10201;

これで馴染みの薄い & や | が脚光を浴びますね!

System.out.println(0b01010 & 0b10101); // => 0
System.out.println(0b01010 | 0b10101); // => 31

……無いですか。使ってる方は今でも特に問題なく使っているのでしょうかね。

数値リテラルにアンダースコアがつけられる

Underscores in Number Literals
そのままです。アンダースコアは単純に無視されるだけです。何がうれしいのかは難しい所ですが、コード内に長いリテラルが入る事があるならば役に立つのかもしれません。

// いままで
int i = 1111111111;
// こう書ける
int j = 1_111_111_111;

System.out.println(i == j); // => true

単純に消えるだけなので、いくつ書いても問題はありません。明確な理由無く数値リテラルをコード内に書くことは無いと思いますし、大きな桁数を入れるときはにっちもさっちもいかに理由があるに違いありません。適当に付けまくって後で見た人を混乱させたりしないと信じてます。そんなことしたら、きっと混乱するのは未来の自分です。

// こんな事も出来る…
int k = 1_____1_11111_1_1_1;

// 前や後ろに付けるとコンパイルエラー
int l = 1234_;

前述の二進数も数値リテラルなので同様にアンダースコアが付けられます。

// 二進数にも付けられます
int b = 0b1_111_11;


業務アプリケーション開発では、この辺は使わなさそうです。そもそも数値リテラルを使う事があまり良くないとされていますし。フラグ値とか定数クラスに定義してるのとか見たりするくらいです。この辺も最近では Enum 使う方向だし。