MessagePack Java版でnullの扱いをどうするか問題

4
Kazuki Ohta @kzk_mover

@frsyuki これがpackerの中でヌルポになるみたいです。 > http://bit.ly/aupU8t

2010-11-08 03:06:05
Sadayuki Furuhashi @frsyuki

@kzk_mover なるほど。strに@MessagePackOptionalアノテーションを付けるとどうでしょう?

2010-11-08 03:08:47
Sadayuki Furuhashi @frsyuki

とりあえずNullPointerExceptionはバグだ…

2010-11-08 03:09:36
Nobuyuki Kubota @nobu_k

nullと空文字列の扱いは、ライブラリ側からすると厄介だなぁ・・・w

2010-11-08 03:10:36
Sadayuki Furuhashi @frsyuki

unpack時にnullを許可しない(MessageTypeExceptionになる)ので、pack時も基本的にnullは許可しない方針だけど、これはJava的にアリなのかナシなのか…。

2010-11-08 03:11:35
Nobuyuki Kubota @nobu_k

@frsyuki 扱ってる対象が文字列じゃなくて文字列オブジェクトの参照なのが厄介だよね・・・。

2010-11-08 03:16:43
Sadayuki Furuhashi @frsyuki

@nobu_k そうなんですよね…。言語仕様的にはオブジェクトは全部nullableなので、非常に厄介です。ここは逆にrequredを指定する方がいいのか…それもどうか…

2010-11-08 03:18:04
Sadayuki Furuhashi @frsyuki

参照型の場合はデフォルトでoptionalフィールドになって、nullを弾きたいときは明示的にMessagePackRequredアノテーションを付ける案はどうか。プリミティブ型は逆で、デフォルトはrequired。

2010-11-08 03:19:41
Sadayuki Furuhashi @frsyuki

参照型とプリミティブ型でここまで挙動が違うのはアリなのか…

2010-11-08 03:20:20
SKS rep @repeatedly

Javaはプリミティブ型を用意しなければよかったんだよね

2010-11-08 03:22:01
Sadayuki Furuhashi @frsyuki

全部デフォルトでoptionalというのは新しいな…! プリミティブ型もoptional。何か問題あるかな。

2010-11-08 03:25:02
Sadayuki Furuhashi @frsyuki

C++版は msgpack::optional<T> を用意する方針が有力。

2010-11-08 03:27:57
Nobuyuki Kubota @nobu_k

@frsyuki プリミティブ型にユーザが値を入れたのかどうか(値がデフォルト値の場合)って、Javaだと何か良い判断方法あるのかなw でもそれができたらものすごく嬉しいよね><

2010-11-08 03:28:56
Sadayuki Furuhashi @frsyuki

@nobu_k 判断方法…無さそうですねw 例えばintのデフォルト値には0を入れたくなりそうですが、言語のデフォルト値も0なので、区別しようがない…。

2010-11-08 03:29:52
Sadayuki Furuhashi @frsyuki

あれ…デフォルトで全部optionalなのは良いかもしれない。

2010-11-08 03:32:27
Sadayuki Furuhashi @frsyuki

String key; みたいなフィールドを書く人は、ここにnullが入らないことを期待するケースが多いのか、むしろ自分でnullをチェックするコードを書くケースが多いのか。

2010-11-08 03:35:51
Nobuyuki Kubota @nobu_k

デフォルト値orユーザ指定の値判別問題むずかしい。gflagsとかもカッチリ使おうとしたときにそこが難点なんだよね。特にboolだと2値しかないので、FLAGS_***がデフォルト値なのか、ユーザが明示的に指定したのか判別できなかったり。

2010-11-08 03:36:47
Nobuyuki Kubota @nobu_k

そういう意味ではJavaのStringとかはnullableなのでoptional的に扱えるけど、プリミティブ型にnullが無いので、プリミティブ型とそうじゃない型で扱いが異なりすぎてウザイ!!

2010-11-08 03:38:27
Sadayuki Furuhashi @frsyuki

boolean を使わずに Boolean を使っていたら true, false, null の3値にしたいんだなーという雰囲気がするけど、では String はどうなのか。int a = 0; とか。

2010-11-08 03:39:04
Nobuyuki Kubota @nobu_k

C++だったらoptional<T>でおk!で済むけどJavaの文化が良くわからんのですがどうするんでしょうね。プリミティブ型使わずにIntegerとかのみに対応しますで良いのかな?

2010-11-08 03:40:02
Sadayuki Furuhashi @frsyuki

C++ならデフォルトでrequiredで、省略可能にしたいなら optional<T> にするに違いないので、Java版でもデフォルトはrequiredで、省略可能にしたいなら MessagePackOptional を付ける方針がウマいと最初は思ったけど、実際どうだろか…

2010-11-08 03:42:48
Sadayuki Furuhashi @frsyuki

Javaはプリミティブ型以外の全部の参照型は optional<T> に相当するので、参照型はデフォルトでoptional、プリミティブ型はrequiredだ、という発想もなきにしもあらず。

2010-11-08 03:44:53
Sadayuki Furuhashi @frsyuki

参照型途プリミティブ型で挙動が全然違うのも困るから、この際全部optionalだ、というのも悪くはない気がする。ぁぁもうワカラン…

2010-11-08 03:45:53
Nobuyuki Kubota @nobu_k

これはかなりアリな気がする! RT @frsyuki: Javaはプリミティブ型以外の全部の参照型は optional<T> に相当するので、参照型はデフォルトでoptional、プリミティブ型はrequiredだ、という発想もなきにしもあらず。

2010-11-08 03:46:03