Java Puzzler ってみた

id:skrb さんの日記から

public class SimpleQuestion {

    static boolean yesOrNo(String s) {
        s = s.toLowerCase();
        if (s.equals("yes")  || s.equals("y") || s.equals("t")) {
            s = "true";
        }
        return Boolean.getBoolean(s);
    } 
    public static void main(String[] args) {
        System.out.println(
            yesOrNo("true") + " "  + yesOrNo("YeS"));
    }
}

(コンパイル通らなかったので少し修正してます)

選択肢が

1. false false
2. true false
3. true true
4. None of the above

です。答えは書かないでおくので、ぜひ考えてみてください。

Java in the Box Annex: 今日の JavaOne 2009 Day 1

との事なので考えてみた!!

とりあえず素直に考える

Boolean#getBoolean って何!? Boolean#valueOf みたいなモノかなぁとか
思ったので,素直に考えると 3 なんだけどなぁ…… Puzzler だしなぁ

調べてみた

引数によって指定されたシステムプロパティーが存在し、それが文字列 "true" に等しい場合にだけ、true を返します。JavaTM プラットフォームのバージョン 1.0.2 以降、この判定では、文字列「true」は大文字と小文字が区別されません。システムプロパティーには、System クラスによって定義される getProperty メソッドを使ってアクセスできます。

指定された名前を持つプロパティがない場合、あるいは指定された名前が空または null の場合は、false が返されます。

Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle

ほほう…… システムプロパティみてるのかぁ……
とりあえず実装見てみると

    public static boolean getBoolean(String name) {
        boolean result = false;
        try {
            result = toBoolean(System.getProperty(name));
        } catch (IllegalArgumentException e) {
        } catch (NullPointerException e) {
        }
        return result;
    }

うひw toBoolean の引数に System.getProperty(name) した値を渡してる><
ちなみに toBoolean の実装

    private static boolean toBoolean(String name) { 
	return ((name != null) && name.equalsIgnoreCase("true"));
    }

で,valueOf の実装は

    public static Boolean valueOf(String s) {
	return toBoolean(s) ? TRUE : FALSE;
    }

なのでやっぱり System.getProperty(name) を渡してる所が違う

システムプロパティには何が入ってるか

とりあえず調べてみる

    for(Object object : System.getProperties().keySet()) {
      	System.out.println(object);
    }

結果

java.runtime.name
sun.boot.library.path
java.vm.version
java.vm.vendor
java.vendor.url
path.separator
java.vm.name
file.encoding.pkg
sun.java.launcher
user.country
sun.os.patch.level
java.vm.specification.name
user.dir
java.runtime.version
java.awt.graphicsenv
java.endorsed.dirs
os.arch
java.io.tmpdir
line.separator
java.vm.specification.vendor
os.name
sun.jnu.encoding
java.library.path
java.specification.name
java.class.version
sun.management.compiler
os.version
user.home
user.timezone
java.awt.printerjob
file.encoding
java.specification.version
java.class.path
user.name
java.vm.specification.version
java.home
sun.arch.data.model
user.language
java.specification.vendor
java.vm.info
java.version
java.ext.dirs
sun.boot.class.path
java.vendor
file.separator
java.vendor.url.bug
sun.io.unicode.encoding
sun.cpu.endian
sun.desktop
sun.cpu.isalist

というわけで true なんで文字列は無いので
System.getProperty("true")
は null が返ってくる.
で,toBoolean に null を渡すと false になるので
結果としては false false になる.

答え

という事で答えは

1. false false

でした.(実行した結果もあってた)

結局……

API ドキュメントもソースも読めない状況だと
絶対正解出来ないなぁwwww


というわけで,id:skrb さん
面白い問題を速攻輸入していただいてありがとうございます♪