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
でした.(実行した結果もあってた)