今日のjavaおっかけ(20150514):requireNonNull

今日はさくっと終わりそうなことをやる。

目次とぶっつぶつテーマ

http://snoopopo.hatenablog.com/entry/2015/04/14/102732

今日のテーマ:requireNonNull

java7より登場した java.util.Objects クラスのメソッド

    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

使ってみる。

   try{
        String s = null;
        s = Objects.requireNonNull(s);
    } catch(NullPointerException e) {
        e.printStackTrace();
    }

速度のはなし

d.hatena.ne.jp

nullチェックの速度の話の記事が以前あがっていたので、一部分だけ自分でもやってみる。

既に上の記事にソースまで載せて頂いてたけど気づかなくて、自分で書いてたからださいコードになってるけど

   public static void main(String[] args) {

        long start = System.currentTimeMillis();
        String s = null;
        for(int i = 0; i < 100; i++){
            try{
                s = Objects.requireNonNull(s);
            } catch(NullPointerException e) {
                e.printStackTrace();
            }
        }
        long end = System.currentTimeMillis();

        long start2 = System.currentTimeMillis();
        String s2 = null;
        for(int i = 0; i < 100; i++){
            try{
                if (null == s2) {
                    throw new NullPointerException();
                }
            } catch(NullPointerException e) {
                e.printStackTrace();
            }
        }
        long end2 = System.currentTimeMillis();


        long start3 = System.currentTimeMillis();
        String s3 = null;
        for(int i = 0; i < 100; i++){
            try{
                s3.getClass();
            } catch(NullPointerException e) {
                e.printStackTrace();
            }
        }
        long end3 = System.currentTimeMillis();


        long start4 = System.currentTimeMillis();
        String s4 = null;
        for(int i = 0; i < 100; i++){
            try{
                s4.toString();
            } catch(NullPointerException e) {
                e.printStackTrace();
            }
        }
        long end4 = System.currentTimeMillis();


        System.out.println("requireNonNull :" + (end - start));
        System.out.println("if :" + (end2 - start2));
        System.out.println("getClass :" + (end3 - start3));
        System.out.println("toString :" + (end4 - start4));
    }

これだと、null発生率100%のものしかみれていないことになるけど…

requireNonNull :11
if :7
getClass :8
toString :5

出力結果はこんなかんじでした。記事のとおり、null率100%の場合は、toStringが早い。

あと、単純にjavaのライブラリのもの使わなくて、自分で if(null == obj) を書いてることが多いので、 これも比べると、なんとなく早そうなんだけど…