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

第13回 エディタの話[その5]─インテンション

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

[コラム]もうひとつの「Language Injection」

インテンションで特定の文字列に指定する以外にも「Language Injection」が存在します。それは特定のAPIの文字列型の引数に対するLanguage Injectionです。デフォルトでもいつくか設定済みですが,自分で作ったAPI(要するにメソッドです)に対しても設定することができます。

設定画面は「Preferences / Language Injections」です。

図12 ⁠Preferences / Language Injections」

図12 「Preferences / Language Injections」

試しにユーザ定義したメソッドの引数に対してLanguage Injectionの設定をしてみます。例としてSample.bar(String)の引数に対して「RegExp(正規表現⁠⁠」のLanguage Injection設定をしてみました図13⁠。

図13 ユーザ定義メソッドのLanguage Injectionを設定した例

図13 ユーザ定義メソッドのLanguage Injectionを設定した例

そうすると,図14のように,そのメソッドを利用する部分で自動的にLanguage Injectionの効果が現れます。

図14 Language Injectionを設定したユーザ定義メソッドの利用例

図14 Language Injectionを設定したユーザ定義メソッドの利用例

これのすごいところは,メソッド引数に直接指定した文字列のみならず,引数に与える変数に対してもLanguage Injectionの効果が現れることです。無駄にスゴイです。

『Declaration / Check RegExp』

Language Injectionで「RegExp(正規表現⁠⁠」に設定した文字列に対して正規表現が正しいかどうかを試すことができます。実際に動いているものを見た方がわかりやすいでしょう図15⁠。

図15 "Check RegExp"の例(クリックすると動きがわかります)

この"Check RegExp"のポップアップはESCキーを押すと消せます。

『Other / Add Clarifying Parentheses』

計算式をわかりやすくするためにカッコを付け加えます。たとえば,図16のようなことをします。

図16 "Add Clarifying Parentheses"の例(クリックすると動きがわかります)

演算子の優先度を知っていれば無用な事なのですが,カッコひとつでわかりやすくなるなら,わかりやすいに越した事は無いですよね。

さらに次のインテンション項目を用いると,定数値を計算して結果を展開します図17⁠。

  • Other / Compute Constant Value
  • Other / Compute Constant Value Subexpression

図17 "Compute Constant Value"の例(クリックすると動きがわかります)

ちょっとした電卓代わりに使えるので割りと重宝しています。似たようなインテンションに『Numbers / Convert to ~』というのがあります。こちらは数値を16進数や8進数表記に変換するインテンションです図18⁠。

図18 "Conver to ~"系の例(クリックすると動きがわかります)

『Strings / Copy String Concatenation Text to the Clipboard』

それほど頻繁に使うインテンションではありませんが,のようなプラス(+)演算子で結合した文字列をひとまとめにしてクリップボードにコピーします。

図19 "Copy String Concatenation Text to the Clipboard"の例(クリックすると動きがわかります)

途中に定数があればそれを展開した値が,変数の場合は「?」に置き換えてコピーされます。残念な事にStringBufiler.append()StringBuffer.append()では使用できません。

コード生成系

これは,おもしろ系というよりネタバレ系ですね。"Show Intentions Action"でテストクラスやサブクラス,ローカル変数を生成できるのは,これらのインテンションのおかげです。

  • Declaration / Create Test
  • Declaration / Implement Abstract Class or Interface
  • Refactoring / Introduce local variable

これらも含めたいろいろなクラスやメソッドの作り方については,この連載の第15回あたりで説明する予定です。

Java7,Java8対応系

通常のJava開発だとココロときめくこれらのインテンションもAndroid Studioでは無用の長物になっています。埋もれさせておくには惜しいので,一応紹介しておきます。

  • Declaration / Expand lambda expression body to code block
    • ラムダ式をコードブロック化します。
  • Declaration / Infer lambda parameter type
    • 型推論で省略したラムダ式のパラメタの型宣言を推測します。
  • Declaration / Make method default
    • メソッドのデフォルト実装を作成します。
  • Declaration / Remove redundant types
    • ラムダ式から冗長な型宣言を削除します。"Infer lambda parameter type"の真逆のことをします。
  • Declaration / Replace Diamond with Explicit Type Arguments
    • ダイヤモンド演算子をJava6の型パラメタに戻します。
  • Declaration / Replace lambda with anonymous class
    • ラムダ式を匿名クラスに置き換えます。
  • Declaration / Replace method reference with lambda
    • メソッドの参照をラムダ式に置き換えます。
  • Declaration / Surround with try-with-resources block
    • AutoCloseable型の変数を try-with-resourcesブロックで囲みます。

Android Studioのプロジェクトは,Project Structureで言語レベルが1.6に設定してあるので,これらの項目が有効になっていても,実際にインテンションとして登場することはありません。

もし,Android StudioからIntelliJに興味を持たれて,通常のJava開発でIntelliJを使うような事があれば,このインテンションのことを思い出してあげてください。

次回の予告

今回説明しきれなかったインスペクションについて説明します。

著者プロフィール

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

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

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

Twitter: @masanobuimai