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

第11回 エディタの話[その3]─コード補完

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

コード補完

EclipseにしろAndroid Studioにしろ,IDEに対して何より期待するのはこのコード補完ではないでしょうか。個人的には,この機能がIDEの特徴を決定づけていると思っています。機能の優劣とは別の世界でIDEの「書き味」を決めているため,この機能が自分のフィーリングに合うかどうかでAndroid Studioを気に入るかどうかが決まるのでは?と大げさながらも思っています。

Android Studioの入力補完は多彩で,コード補完以外にも用途に応じたコマンドが提供されています。

通常のコード補完
メニューバーの「Code → Completion → Basic」
スマートなコード補完
メニューバーのode → Completion → SmartType」
キーワード展開
メニューバーの「Code → Completion → Cyclic Expand Word / Cyclic Expand Word (Backward) 」
ライブテンプレートの展開
メニューバーの「Code → Insert Live Template」
コードを囲んだライブテンプレートの展開
メニューバーの「Code → Surround with Live Template」

図4 メニューバーの「Code → Completion」の補完メニューとテンプレート展開メニュー

図4 メニューバーの「Code → Completion」の補完メニューとテンプレート展開メニュー

Eclipseのように「Ctrl+スペース」で大抵のことをしてくれるのに慣れていると,信じがたいコマンドの多さですね。これらのコード補完のコマンドを実行しなくても,携帯電話やスマートフォンの予測変換のようにタイプした文字に応じたコード補完を自動的に行います。

この自動補完の候補は曖昧といえば曖昧で,利用者が明示的に「この補完をしたい」と思った場合は,やはり前述した目的別の補完コマンドを実行したほうがストレスが少なく済みます。

おそらくVisual Studioに刺激を受けたと思われる,この自動補完はIntelliJの現行バージョン(IDEA12)から採用された機能で,まだ洗練されているとは言いがたいところがあります(もしくは筆者がそのクセを掴めないでいる⁠⁠。そもそもが「利用者がしたいことを,明確に要求せよ」という発想のIDEであるため,先ほどのコマンドを駆使した明示的なコード補完のほうが思い通りにしやすいです。

さきほどの入力補完のうちテンプレート展開以外のコード補完について説明します(テンプレート展開については次回説明します⁠⁠。

通常のコード補完(Basic補完)

いわゆる普通(?)のコード補完です。変数名やキーワード(予約語⁠⁠,メソッドなどを補完候補に出します。まだインポートしていないクラスも候補に上げます。

あと意外なところで,オーバライド(継承)できるメソッドやインプリメント(実装)しないといけないメソッドも補完候補に出てきます。当然ながらカーソルがしかるべき場所にいないと,これらは補完候補には出てきません。

図5 継承できる/実装するメソッドもBasic補完の候補に出てくる

図5 継承できる/実装するメソッドもBasic補完の候補に出てくる

同様のことはEclipseの補完(Ctrl+スペース)でもできますね。見た感じではEclipseのほうが必要な候補が絞り込まれている分,該当メソッドを探しやすそうです図6⁠。

図6 Eclipseのコード補完でも「継承できる/実装するメソッド」が候補に出てくる

図6 Eclipseのコード補完でも「継承できる/実装するメソッド」が候補に出てくる

Eclipseだと「Ctrl+スペース」でgetter/setterも作成できますが,Android Studioではできません。つい最近,IntelliJの次期バージョンにこの機能が実装されたので,Android Studioでもそのうちできるようになると思います(参考:IDEA-105093 Eclipse-way getter/setter completion⁠。

スマートなコード補完(Smart補完)

スマート(賢い)補完を行います。なにがどう賢いのかというと,文脈に依存して適切な候補を絞り込みます。要するに期待する型を返すものだけに候補を絞り込んで補完を行います。個人的にはBasic補完よりよく使います。

たとえば,リスト1のようなコード片があったとします。

リスト1 サンプルコード

List<String> list = new ArrayList<String>();

これをどうタイプしていくかで,その人のクセやIDEの書き味が垣間見られますが,先頭から正直にタイプしていくのがAndroid Studioに向いていると筆者は思ってます。実際に試してみたのが図7になります。newのあとでSmart補完を行っています。

図7 Smart補完の例(クリックすると動きがわかります)

Smart補完は左辺が期待する型List<String>のみを補完候補にあげます。Java言語が強い型付き言語で,最初に型宣言を行ったり,左辺の求める型を右辺に設定するのに合わせて用意された補完タイプです。

Smart補完はとても便利なのですが,いかんせん割り当てられたショートカットキー(Ctrl+SHIFT+スペース)がイケてないです。かなり頻繁に使うの機能が3つキーを同時押ししなければならないというのがガマンならず,筆者は「SHIFT+スペース」に設定変更して長年使っています。

[コラム]型宣言は後で行うのがイマドキでしょう

傾向的にEclipseを使いこなしている人に多く見かけるタイプ方法なんですが,まず最初にnew ArrayList<String>()をタイプしてから,クイックアシスト(Ctrl+2, L)List<String> list =を展開するやり方を見かけます。

図8 Eclipseのクイックアシスト機能の例

図8 Eclipseのクイックアシスト機能の例

「これってAndroid Studioでできるの?」と真っ先に疑問に思うかと思います。結論から言うと,一応できますが,ちょっと期待はずれな動作をします。まず第一にEclipseのクイックアシストのような便利な機能はありません。クイックフィックス(Ctrl+1)に近い機能で,"Show Intention Actions" というのがある程度です(大抵は,⁠ALT/opt+Enter」にキーが割り当てられています⁠⁠。

"Show Intention Actions"で表示されるポップメニューから「Introduce local variable」を実行すると,Eclipseの「Ctrl+2, L」相当のことができます。

図9 ⁠Introduce local variable」の例(クリックすると動きがわかります)

「⁠Introduce local variable」の例` &title=`図9 ⁠Introduce local variable」の例` &width=`396` />

「Introduce local variable」を実行したときに表示される変数名の候補リストの最下部に「Press SHIFT+Tab change type」と出ています。この指示に従うとカーソルが変数名から型名に移り,型名の決定→変数名の決定と続きます。Eclipseのように,常に変数名の決定→型名の決定となれば良いと思うのですが,ちょっと不思議な動作をします。

このリズムが身に付かないと,ついウッカリ変数名を確定してしまい,あとでチマチマと型の修正をしなければなりません。筆者はこの相性が合わなくて,この「Introduce local variable」を多用しません。

著者プロフィール

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

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

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

Twitter: @masanobuimai