B-Teck!

お仕事からゲームまで幅広く

【Kotlin】KotlinのNull安全

dogwood008.github.io KotlinのリファレンスのNull安全のページが英語しかなさそうだったので、ざっくり翻訳しつつ例を足したりした。

Null安全

Kotlinでは下記の要因以外でNPEを起こすことが無いよう作られている。

  • 明示的な throw NullPointerException()
  • !! 演算子を使用した場合
  • 外部のJavaコードが原因の場合
  • コンストラクタで利用可能な初期化されていないthisが使用されている

Null可能値

Null値を取りうる変数は明示的にNull可能値としなければならない

var a: String = "abc"
a = null // コンパイルエラー
val l = a.length

var b: String? = "abc"
b = null // ok
val l = b.length // bはNullableなのでエラー

Non-Nullableなオブジェクトは安全にプロパティにアクセスできる。
NullableなオブジェクトはNPEの可能性があるためエラーとなる。

Nullableなオブジェクトにアクセスしたい場合

Nullチェックを行う

val a :String? = "testa"
var b :String? = "testb"
var c :String? = "testc"

val l = if (a != null) print("String of length ${a.length}\n") else print("\n")

if (b != null && b.length > 0)
    print("String of length ${b.length}\n")
else
    print("Empty string\n")

if (c != null && c.length > 0){
    c = null // nullを代入できてしまう!
    print("String of length ${c.length}\n")
}else{
    print("Empty string\n")
}

Nullチェックを行った後は、Nullableなオブジェクトが自動でキャストされ、
プロパティにアクセスが可能になる。
varの場合、チェック後にnullを代入出来てしまうため注意

安全呼び出し

val l:Int? = b?.length

上記の場合、bがnullならnullを、そうでなければb.lengthlに代入する。
Intまたはnullが返却されるため型はInt?となる

bob?.department?.head?.name

安全呼び出しはチェーンすることができ、上記の場合はいずれかのプロパティがnullならnullを返す。

その他のNullに関する演算子等

エルビス演算子

val l: Int = b?.length ?: -1

上記の場合,b?.lengthがnullでない場合はb.length、nullの場合は右辺が評価されて-1を返す。

!!演算子

val l = b!!.length()

上記の場合、b.length()がnullであればNPEを発生させる。 nullでない場合はエルビス演算子と同様にb.lengthの値を返す。

セーフキャスト

val aInt: Int? = a as? Int

上記の例ではaがnullの場合はaIntはnull、nullでない場合はaとなる。
KotlinのキャストはNull安全でないため、正しい型でないとClassCastExceptionが発生してしまう。
セーフキャストを行う事でエラーを避けて安全なキャストができる。

【本】2時間でおさらいできる戦国史を読んだ

2時間でおさらいできる戦国史 (だいわ文庫)

2時間でおさらいできる戦国史 (だいわ文庫)

概要

  • 第1章 戦国時代の幕開け
  • 第2章 村の世界
  • 第3章 東日本の戦国大名
  • 第4章 戦国大名の領国支配
  • 第5章 西日本の戦国大名
  • 第6章 「天下統一」をめざした織田信長
  • 第7章 農民からのし上がって全国統一した豊臣秀吉
  • 第8章 江戸幕府をひらいた徳川家康

1章と2章で当時の様子や戦国時代になっていく背景、
3~5章で著名な戦国大名を取り扱いながら情勢や統治の仕組み、 6~8章で一人にフォーカスを当てながら江戸幕府が開かれるまでを解説している。

感想

戦国時代については学校以来全く思い出す機会がなかったのもあり、さっぱり忘れてしまっていた。
タイトルには2時間でおさらいできる~と書いてあるものの、自分は4~5時間はかけて読んだように思う。
うっすらと記憶に残っていて、「おさらい」の人ならそのくらいの時間で読めるのかも知れない。
大筋に関わってくるような大名以外は説明を省き、戦国時代の概観をざっくりと書いているので、
前提知識がない状態でもなんとなくの流れが理解できた。
本格的に歴史を学ぶには足りないかも知れないが、ここから新しい本へ手を伸ばすきっかけにするには良い本だと思う。

【Java】JAX-RSの自分用メモ

JAX-RSとは?

JavaEE6から入ったRESTful APIを作成するのに適したフレームワーク。

JAX-RSの使い始め方

JAX-RSに対応したサーバはApplicationのサブクラスを検知すると、
後述のリソースクラスなどを読み込んで自動で立ち上がってくれる

  • javax.ws.rs.core.Applicationを継承する
  • @ApplicationPathでルートパスを設定する
    (http://<ホスト名>/<コンテキストパス>/<ルートパス>)
import javax.ws.rs.core.Application;

@ApplicationPath("app")
public class TestApplication extends Application{

}

リソースクラス

HTTPリクエストを受け取るクラスをリソースクラス、
HTTPリクエストに応じて実行されるメソッドをリソースメソッドと呼ぶ。 リソースメソッドの振る舞いは様々なアノテーションで定義する。

よく使うアノテーション

  • @Path が記載されていればリソースクラスとして認識される。
    (<ルートパス>/<リクエスト用パス>)
  • @Path はメソッドに定義することもできる
  • @GET @POST @PUT @DELETE の記述でどのHTTPメソッドに対応しているか定義する。
  • リクエストのパラメータは @QueryParam アノテーションの記載された変数で受け取ることができる
  • @Path{id} のような形で記述すると、 @PathParam("id") アノテーションで変数に受け取らせる事ができる
  • @FormParam("input-name") でフォームからPOSTされた値を受け取ることができる
  • @Produces() でContent-Typeを設定できる
  • @DefaultValue でパラメータのデフォルト値を設定できる
@Path("/test")
public class TestResource{
    @QueryParam("hoge")
    private String hoge;
    
    @GET
    @Path("{id}")
    @Produce("application/json")
    public Test getTest(@PathParam("id") String id){
        @DefaultValue("noname")
        @QueryParam("name")
        private String name;
        return service.findById(id, name, hoge);
    } 
}