ActivityのクラスにおいてbindServiceメソッドを用いて、Serviceのクラスを立ち上げようとしたところ、下記の実行時エラーがLogに出る。
DEBUG/dalvikvm(5311): newInstance failed: Ljp/(省略)/(省略)/XXXService;.<init>() not accessible to Landroid/app/ActivityThread;
このエラーは、Serviceのクラスのコンストラクタ(constructor)にアクセス修飾子(access modifier)を記述していなかったため発生したものである。
アクセス修飾子を記述しない場合、デフォルトのアクセス制限が課せられる。この制限の強度は、privateよりは弱く、protectedよりは強いというものである。
何も考えずに、何も書かないでおくと、何も想定していないエラーに遭遇する。
どうせ何も考えないのであれば、コンストラクタのアクセス修飾子はpublicにしておこう。
コンストラクタをpublicにした場合における不都合ってのは、普通は、ありえない。逆に、コンストラクタにアクセス制限をかけると上記の災難に遭遇する。
クラス宣言をpublicにしておきながら、そのコンストラクタにはアクセス制限を加えるってのは特殊な設計ですな。そういう場合には、そういうアナウンスをしっかりすべきですな。
実際には、特殊な設計を積極的に行ったのではなく、な~んにも考えずに書きました、ってことかもしれない。
実際には、特殊な設計を積極的に行ったのではなく、な~んにも考えずに書きました、ってことかもしれない。
で、繰り返しになりますが、
【教訓】コンストラクタはpublicにせよ
0 件のコメント:
コメントを投稿