読者です 読者をやめる 読者になる 読者になる

ナカザンドットネット

Android Developer's memo

Icepickにノスタルジックな変更が入りました

Android ポエム

ポエムです。

皆さん、Icepickをご存知でしょうか。ActivityやFragmentに書いたプロパティをSavedInstanceStateで保存/復元する責務だけを持つ、アンチAndroidAnnotations界隈では人気のあるAndroid向けライブラリですね。

このIcepickに、下記のコミットが行われました。

github.com

さよなら、@Icicle。

分かる人には分かる、寂しい変更です。この記事ではAndroid界の老害たちに向けて、昔を懐かしむ話をしたいと思います。

何が変わったのか

これまでのIcepickは、@Icicle アノテーションを付加することで、状態保存の対象を指定していました。

class ExampleActivity extends Activity {
  @Icicle String username;
  ...
}

しかしこれからは、代わりに@Stateアノテーションを付加することになります。

class ExampleActivity extends Activity {
  @State String username;
  ...
}

Icepickがやりたいことは、 onCreateonSaveInstanceStateonRestoreInstanceState などで行われる、savedInstanceStateに対するI/O操作の簡略化です。この責務において、この名称変更は理に適ったものと言えるでしょう。

Icicleという名前の由来

そもそも、Icicleという言葉はどこから出てきていたのでしょうか。それを説明するには、Androidクロニクルにおける紀元前、Android 1.0より前の時代まで遡らなくてはなりません。

Significant API Changes
onFreeze(Bundle) renamed to onSaveInstanceState(Bundle), to better reflect the fact that it does not represent an actual change in application lifecycle
Release Notes for Older SDK Versions | Android Developers

Android 0.9 SDK Beta (r1)での代表的な変更の中に、

  • onFreezeonSaveInstanceState に改名

というものがありました。そしてこの頃、onCreateは下記のような形でした。

@Override
protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.any_layout);
}

現在では savedInstanceState と記されている場所に、 icicle (つらら)の名を冠した変数が置かれていたのです。

おそらくは、「onFreezeで凍らせた"状態"が、onCreateでつららのように上から降ってくるよ」というニュアンスだったのでしょう。

Icicleの時代

日本にAndroidが上陸した2009年時点では、既にAndroidのバージョンは1.5 Cupcakeになっていました。もちろん、onFreezeはとっくに滅びています。

しかし、何故か、その名残はしばらく残っていたのです。

stackoverflow.com

2009年のStackOverflowに、ハッキリとicicleの文字が載っていますね。また、2011年終盤の時点でも、Android Maps周りには古いコードが残っていたようです。

それらもいつしか savedInstanceState へと置き換わっていき、 Icepickが故人を偲ぶように@Icicleを残し続けるばかりとなっていました。

さよなら、Icicle

Icepickが@Icicleを捨てたことで、恐らくAndroid界隈からicicleという言葉はほとんど消えてなくなるでしょう。機能の命名は過度に詩的であってはいけません。寂しさはありますが、Icepickにとっては、@Stateが正しいのです。

さようなら@Icicle。いままでありがとう。僕たちはこれからも頑張っていくから。見守っていてください。

あとがき

  • そういえば俺、Icepick使ってるプロダクトないなー(
  • それにしても、ButterKnife 7.0の件といい、Robolectric 3.0の件といい、命名の見直しが流行ってるんだろうか。