谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

引数なしのgetBytesがダメな理由。

Javaレビューへのトラックバックを頂きました。

http://d.hatena.ne.jp/cero-t/20100104/1262625958
言いたいことはわかるし、底大事なところだけれどもプラットフォームのエンコーディングを使いたい場合というのは結構あるので個人的には問題点だというのには抵抗がある。
同じLinuxでもUTF-8の環境とEUCの場合とあるよね?WindowsならSJISの可能性が高い。

あんまり納得できないかな - しんさんの出張所 はてな編


私自身の経験が、エンタープライズもののサーバサイドJavaが中心だったためか、
プラットフォームのエンコーディングを使いたい場面はほとんどなくて、
引数なしのgetBytesは、常に「問題」にしか、なりませんでした。


しかしながら、プラットフォームのエンコーディングを使いたい場面があるのも確かですね。
ただ、アプリケーション中に、エンコーディングが固定の(指定する)場所と、
デフォルトエンコードを使う場所の両方があるなら、以下のように書いて、
デフォルトエンコーディングを使うことを明示するべきだと思います。

str.getBytes(System.getProperty("file.encoding"));

# もちろん、どこかで定数として切っておいた方が良いでしょうけど。


デフォルトエンコーディングを使う際でも、このように引数を指定すべきだと考えるのは、
引数がない場合、意図せずに抜けてしまったのか、意図して抜いたのかが分からないためです。
多少回りくどくても引数で明示しておくことで、一目で意図が伝わるため、保守性が高くなると考えます。


余談ですが、Java5以降ならCharsetクラス経由でもデフォルトエンコーディングを取得できるようですね。

// Java6の場合
str.getBytes(Charset.defaultCharset());

// Java5の場合。もちろん例外処理は必要。
str.getBytes(Charset.defaultCharset().name());

こちらでも(多少見慣れないかも知れませんが)、やはり意図が伝わりやすくなるように思います。


どうでしょうか。