Android Studio最速入門~効率的にコーディングするための使い方

第41回 コードフォーマット

この記事を読むのに必要な時間:およそ 10.5 分

コーディング時に適時インポートの最適化を行う

「Preferences / Code Style / Java / Imports」の設定はあくまでインポート文のスタイル指定です。既存のファイルを編集する時は別として,新規にファイルを作成する場合,インポート文はコーディングしながら自動展開していくのが普通だと思います。なんとなくエディタの話に戻りますが,コーディング中に適時インポートの最適化を行うかどうかの設定が いくつか あります。

その代表格が「Preferences / Editor / Auto Import」です。

図3 その代表格が「Preferences / Editor / Auto Import」設定画面

図3 その代表格が「Preferences / Editor / Auto Import」設定画面

Insert import on paste
コード片をペーストした際にインポートが必要だった場合の振る舞いを指定します。
  • All:必要なインポート文を自動的に追加します。
  • Ask:必要なインポート文を確認するダイアログを表示し,インポートするかどうかを問い合わせます(筆者はこの設定を好んでます⁠⁠。
  • None:インポート文が必要だとしても何もしません。
Show import popup
インポートする候補をポップアップ表示します。通常ONにします(これをOFFにする理由を知りたいくらいです⁠⁠。遙かかなた昔は意味のあったオプションなのですが,IntelliJ IDEA13をベースにしているAndroid Studioのコード補完機能はより高度になっているので,このオプションがONであろうとOFFであろうと,インポートするパッケージの候補が表示されます。
Optimize imports on the fly
コーディングしながらリアルタイムにインポートの最適化を行います。最適化の精度はそれほど高くありません。コードスタイル設定で「Use single class import」を有効にしていても,すでにimport java.util.*;などの記述があれば,それを優先します。
基本的にONにすることをオススメします。ただし,チーム開発で他人が作ったコードを編集する時など涙をのんでOFFにする場合もあります。時と場合によっては「インポートの最適化」は寝た子を起こすな的な意味で余計なお世話になるからです。
また不要なインポート文を除去する場合は,これの他にインスペクションの「Imports / Unused import(editor light)」を有効にする必要があります。まわりくどいですね。
Add unambiguous imports on the fly
MapArrayListなどインポートするパッケージが一意な場合,利用者に問い合わせなく勝手にインポートを追加するかどうかを指定します。通常のコード補完でも似たような振る舞いをしているので,ONにしておいて邪魔になることはないでしょう。
Exclude from Inport and Completion
インポートやコード補完の候補から除外するパッケージを指定します。ここで設定しなくてもコード補完の候補リストから除外パッケージを指定できます。むしろ,そのほうが便利です。

図4 コード補完時に自動インポートの除外パッケージを指定する

図4 コード補完時に自動インポートの除外パッケージを指定する

どちらかというと間違えて除外設定してしまったパッケージ指定を削除するために用いるのが主な使い道になるでしょう。

コーディングしながら半自動的にインポート文を展開していく書き心地はIDEによって微妙に異なるので,Eclipseからの移行組は特に違和感を感じる部分ではないでしょうか。

コーディング中のインポートに関わる設定は,このほかにインスペクションとインテンションにもあります。まずはインスペクションですが「Imports」カテゴリにいくつか設定があります。

'*' import
パッケージ全体のインポート(アスタリスク指定のインポート文)を警告します。ここをONにすると「Preferences / Code Style」「imports」設定に関わりなく警告してきます。
Import from same package
自身が属するパッケージをインポートしている場合に警告します。多くの読者は,そんなマヌケな事はしないと思いますが,時折このようなコードを見て世界の広さを感じることがあります。
'java.lang' import
java.langパッケージをインポートしている場合に警告します。
Redundant import
重複したインポート文があれば警告します。
Single class import
クラス指定のインポートをしている場合に警告します。\* import」の真逆です。こちらも「Preferences / Code Style」「imports」設定に関わりなく警告してきます。
Static import
スタティックインポートを使っていると警告してきます。Optionsに「staticインポートを許可するクラス(Statically importable Classes⁠⁠」を指定することができます。また「テストコードでのみ許可する(Ignore in test code⁠⁠」などユニークなオプションがあります。

図5 ⁠Static import」の設定項目

図5 「Static import」の設定項目

Unused import
使っていないパッケージのインポート文があれば警告します。次の「Unused inport(editor light)」とやることは同じですが,こちらは第40回で紹介した"Inspect Code..."用です。
Unused inport(editor light)
使っていないパッケージのインポート文があれば警告します。⁠Preferences / Editor / Auto Imports」「Optimize imports on the fly」と組み合わせると,不要なインポート文を即座に削除します。
常にインポート文が最適化してあるのは気持ちの良い事なのですが,あまりにも即時過ぎると,ちょっとコードを弄っただけでインポート文を削除するので,それが思考の妨げになる時があります。インポート文の最適化もやり過ぎ注意ですね。

続いてインテンション(⁠⁠Preferences / Intentions⁠⁠)です。カテゴリは「Declaration」「Imports」の2ヵ所です。インテンションはお節介機能なので,どれを有効にしておくかは利用者の好みです。

Declaration / Replace Implements with Static Import
implementsextendsに指定しているインターフェイスやクラスの利用箇所をスタティックインポートに置き換えます。
Declaration / Replace On Demand Import with Single Class Imports
パッケージインポート(アスタリスク指定)をシングルクラスのインポートに置き換えます。
Declaration / Replace Qualified Name with Import
完全修飾で指定しているクラスやインターフェイスをインポート文に置き換えます。
Imports / Add On Demand Static Import
スタティックインポートに変換可能ならばスタティックインポートに置き換えます。
Imports / Add Single-Member Static Import
スタティックインポートをアスタリスク指定ではなくシングルメンバで記述します。
Imports / Expand Static Import
スタティックインポートをやめて元に戻します。これをONにする用途はそう無いでしょう。

これらの設定を行った上で,普通にコーディングしていれば普通にインポートの最適化が行われていくと思います。Eclipse移行組の方は,Eclipseとの書き味の違いを上記の設定と慣れでカバーしましょう(とはいえ大半は慣れるしか無いのですけど……⁠⁠。

コマンドを実行してインポートの最適化を行う

メニューバーの「Code → Optimize Imports...」からインポートの最適化を行う方法です。

こちらのコマンドによる方法だと,よりコードスタイルに準じたインポートの最適化が行われます。先ほどの「on the fly」モードではできなかったインポートスタイルの統一(アスタリスク指定,またはシングルクラス指定)も行います。

コマンドを実行すると図6のようなダイアログが表示されます。

図6 ⁠Optimize Imports」ダイアログ

図6 「Optimize Imports」ダイアログ

ダイアログには「インポートの最適化」を行う対象を選ぶ部分がありますが,その表示はコマンド("Optimzie Imports...")を実行した場所によって若干内容が変わります。

見ての通り指定したディレクトリ配下に対して「インポートの最適化」を施すことができるので「Projectツールウィンドウ」あたりから実行するのが適切だと思います(ちょうど「Projectツールウィンドウ」のコンテキストメニューにも「Optimize Imports...」があります⁠⁠。

Eclipseの「インポートの編成」の場合,インポートが不完全なコードもインポート文を補完してあるべき姿に最適化していきますが,Android Studioではインポートしていないパッケージの補完は行いません。あくまで今のソースコードに記述しているインポート文だけが最適化の対象となります。

インポートしていないパッケージが存在する状態は「単なるコーディングエラーなのでコーディング中に解決せよ」というスタンスなんでしょうか。ただ,そのような状態でコーディングを進める事はほとんどないため,筆者はこの振る舞いに不満を持ったことがありません(むしろ,今回の比較を行って違いに気づいたくらいです⁠⁠。Eclipse移行組で,Eclipseのこの特性を利用したコーディングに慣れていたりすると,この振る舞いの違いはストレスの元になりそうです。

著者プロフィール

今井勝信(いまいまさのぶ)

システムエンジニア。日本ユニシス株式会社所属。仙台在住。

Android開発はまったくやったことがないけれどIntelliJ IDEAが大好き。

Twitter: @masanobuimai