Search on the blog

2012年8月7日火曜日

Reading Java RunTime Source Code (2)

java.lang.Booleanのソースを読みました。おもしろかったところだけ簡単にまとめておきます。

getPrimitiveClass
Class<Boolean> TYPE = Class.getPrimitiveClass("boolean");
でbooleanのラッパークラスのClassインスタンスを取得します。 Class.getPrimitiveClassメソッドの定義を見ると、以下のようにnative修飾子がついています。
static native Class getPrimitiveClass(String name);
native修飾子は、そのメソッドの実装が Java 以外の言語で記述されてコンパイルされていることを示します。ということで現段階で深堀りするのはやめておきます。

serialVersionID
シリアライズするときに使うもの。シリアライズしたオブジェクトをreadしようとしたとき、 クラスの仕様が変更されていたら不都合があるので、この番号でクラスの仕様が等しいことを確認するようです(http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/)。

hashCode
これはもともとObjectクラスで定義されており、Booleanクラスでオーバーライドされています。 何のために使うのかというと、
Returns a hash code value for the object. This method is
supported for the benefit of hash tables such as those provided by java.util.HashMap(コメントより抜粋)
らしいです。

getBoolean
System.getProperty(property_name) で取得したプロパティ値をBooleanにキャストして返します。
プロパティはこんなのがあるらしいです。
http://docstore.mik.ua/orelly/java/fclass/ch10_02.htm 

上記のページに載っているプロパティを見てもいまいち使い方が分からなかったので、値がtrueになるプロパティがもともと定義されているかどうか以下のコードを書いて調べました。
public class Main {
 public static void main(String[] args) {
  Properties propaties = System.getProperties();
  Set<Entry<Object, Object>> pset = propaties.entrySet();
  for (Entry<Object, Object> entry : pset) {
   String pkey = (String)entry.getKey();
   String pvalue = (String)entry.getValue();
   if ("true".equalsIgnoreCase(pvalue))
    System.out.println(pkey);
  }  
 }
}
無かったです。。おそらく開発者がアプリ上で設定した値の真偽を調べるために使われるものだと考えられます。こんな風に。
public class Main {
 public static void main(String[] args) {
  System.setProperty("logined", "true");
  System.setProperty("network-connected", "true");
  
  System.out.println(Boolean.getBoolean("logined"));
  System.out.println(Boolean.getBoolean("network-connected"));
 }
}

0 件のコメント:

コメントを投稿