はじめに
今回は、
リネーム(Rename, Rename File)
実はリネームは2種類あります。"Rename..."は前回説明したとおりですが、

Javaのファイルに対して"Rename File..."を実行すると、
使い方
- エディタや
「Projectツールウィンドウ」 上で、 リネームしたいファイルやシンボルを選択 - "Rename..."を実行
シグネチャの変更(Change Signature)
メソッドの宣言部や呼び出し部分で実行すれば、
メソッドシグネチャでは、


使い方
- エディタ上で、
シグネチャを変更したいメソッドやクラスにカーソルを置く - "Change Signature..."を実行
型のマイグレーション(Type Migration)
インスタンス変数や型パラメタの型を他の型に変換します。たとえば int
をString
に、

使い方
- エディタ上で型を表している部分にカーソルを置く
- "Type Migration..."を実行
スタティック化(Make Static)
インスタンスメソッドや内部クラスをスタティックに変換します。

使い方
- 「Structureツールウィンドウ」
やエディタ上で、 スタティック化したいメソッドやクラスを選ぶ (エディタの場合、 カーソルを置く) - "Make Static..."を実行
インスタンスメソッドに変換(Convert To Instance Method)
スタティックメソッドをインスタンスメソッドに変換します。先ほど紹介した

使い方
- エディタ上で変換したいメソッドにカーソルを置く
- "Convert To Instance Method..."を実行
移動(Move)
主に

使い方
- 「Projectツールウィンドウ」
や 「Structureツールウィンドウ」、 エディタ上で対象を選ぶ (エディタの場合、 カーソルを置く) -
"Move..."を実行
「Projectツールウィンドウ」 の場合は、 ドラッグ&ドロップで移動 (Move) になります。さらに 「Show Members」 オプションを有効にすると、 メンバの移動もドラッグ&ドロップで可能になります。 - にもかかわらず、
「Structureツールウィンドウ」 ではドラッグ&ドロップ操作はできません。
コピー(Copy, Clone)
主に
"Clone..."は

使い方
- 「Projectツールウィンドウ」
やエディタ上で対象を選ぶ (エディタの場合、 カーソルを置く) -
"Copy..." または "Clone..." を実行
「Projectツールウィンドウ」 の場合は、 ドラッグ&ドロップで移動 (Move)、 Ctrlキーを押しながらドラッグ&ドロップでコピー (Copy) になります。
安全な削除(Safe Delete)
主に

使い方
- 「Projectツールウィンドウ」
や 「Structureツールウィンドウ」、 エディタ上で対象を選ぶ (エディタの場合、 カーソルを置く) - "Safe Delete..." を実行
抽出(Extract)
JavaやXMLのコード片から変数やメソッド、

また抽出系リファクタリングは、
ローカル変数の抽出(Variable)
選択した式をローカル変数にします。実を言うと第11回で紹介した

使い方
- エディタ上でローカル変数に置き換えたい式にカーソルを置く
-
"Variable..."を実行
- カーソル位置から置換可能な式の候補が複数ある場合は、
どれを置換するか指定する - 置き換える式が複数箇所で見つかった場合、
すべて置換するかどうかを指定する
- カーソル位置から置換可能な式の候補が複数ある場合は、
定数(クラス変数)の抽出(Constant)
選択した式をクラス変数にします。また、

使い方
- エディタ上でクラス変数に置き換えたい式または宣言にカーソルを置く
- "Constant..."を実行
フィールド(インスタンス変数)の抽出(Field)
選択した式をインスタンス変数にします。このとき、

使い方
- エディタ上でインスタンス変数に置き換えたい式または宣言にカーソルを置く
- "Field..."を実行
引数の抽出(Parameter)
メソッド内の式を、

使い方
- エディタ上で引数に置き換えたい式にカーソルを置く
- "Parameter..."を実行
パラメタオブジェクトの抽出(Parameter Object)
メソッドの引数をまとめたラッパークラスを作成するか、
使い方
- 「Structureツールウィンドウ」
またはエディタで、 パラメタオブジェクトを適用したいメソッドを選ぶ (エディタの場合、 カーソルを置く) - "Parameter Object..."を実行
(「Introduce Parameter Object」 ダイアログに諸設定を行う)

メソッドの抽出(Method)
選択した範囲
使い方
- エディタ上で、
メソッドにしたいコードブロックを選択 - "Method..."を実行
(「Extract Method」 ダイアログに諸設定を行う)

メソッドオブジェクトの抽出(Method Object)
選択した範囲invoke()
になるようです。
使い方
- エディタ上で、
メソッドオブジェクトにしたいコードブロックを選択 - "Method Object..."を実行
(「Extract Method Object」 ダイアログに諸設定を行う)

クラスの抽出(Delegate)
既存のクラスの一部
コマンド名は"Delegate..."
使い方
- 「Projectツールウィンドウ」
や 「Structureツールウィンドウ」、 エディタで対象のクラスを選ぶ (エディタの場合、 カーソルを置く) - "Delegate..."を実行
(「Extract Class」 ダイアログに諸設定を行う)

インターフェイスの抽出(Interface)
エディタや
使い方
- 「Projectツールウィンドウ」
や 「Structureツールウィンドウ」、 エディタで対象のクラスを選ぶ (エディタの場合、 カーソルを置く) - "Interface..."を実行
(「Extract Interface」 ダイアログに諸設定を行う)

スーパークラスの抽出(Superclass)
「インターフェイスの抽出」
使い方
- 「Projectツールウィンドウ」
や 「Structureツールウィンドウ」、 エディタで対象のクラスを選ぶ (エディタの場合、 カーソルを置く) - "Superclass..."を実行
(「Extract Superclass」 ダイアログに諸設定を行う)

スタイルの抽出(Style)
Android固有のリファクタリングです。レイアウトリソースからスタイルを抽出します。抽出したスタイルは style.
に定義され、style
属性に置き換えられます。
使い方
- エディタ上で、
スタイルを抽出したいXMLエレメントにカーソルを置く - "Style..."を実行
(「Extract Android Style」 ダイアログに諸設定を行う)

レイアウトの抽出(Layout)
Android固有のリファクタリングです。レイアウトリソースを分離して別ファイルに抽出します。抽出した後は <include layout="...">
に置き換えられます。
使い方
- エディタ上で、
レイアウトを分離したいXMLエレメントにカーソルを置く (もしくは範囲を選択する) - "Layout..."を実行
(「Extract Android Layout」 ダイアログに諸設定を行う)

インライン化(Inline)
変数/
使い方
- エディタ上でインライン化したいシンボルにカーソルを置く
- "Inline..."を実行
(インライン化可能な箇所が複数ある場合、 すべてを変更するかどうかを問い合わせてきます)


重複したコードの置換(Find and Replace Code Deplicates)
選択したメソッドに類似したコードを検索し、
使い方
- エディタ上で対象にしたいメソッドにカーソルを置く
- "Find and Replace Code Deplicates..."を実行
(「Specify Replace Code Duplicates Scope」 ダイアログに重複コードを探す範囲を指定します)

真偽の反転(Invert Boolean)
メソッドや変数のBoolean値を反転させます。
使い方
- エディタ上で対象にしたいメソッドや変数にカーソルを置く
- "Invert Boolean..."を実行

メンバのプルアップ(Pull Members Up)
クラスのメンバ
使い方
- 「Projectツールウィンドウ」
や 「Structureツールウィンドウ」、 エディタで対象のクラスを選ぶ (エディタの場合、 カーソルを置く) - "Pull Members Up..."を実行

メンバのプッシュダウン(Push Members Down)
プルアップの逆で、
使い方
- 「Projectツールウィンドウ」
や 「Structureツールウィンドウ」、 エディタで対象のクラスを選ぶ (エディタの場合、 カーソルを置く) - "Push Members Down..."を実行

可能ならばインターフェイスを使用する(Use Interface Where Possible)
指定したクラスの参照箇所をインターフェイスに置き換え可能ならばインターフェイスに置き換えます
使い方
- エディタ上で、
インターフェイスやスーパークラスに置換したいクラスにカーソルを置く - "Use Interface Where Possible..."を実行

継承をデリゲートに置き換える(Replace Inheritance with Delegation)
親クラスの継承関係を外して、
使い方
- 「Projectツールウィンドウ」
や 「Structureツールウィンドウ」、 エディタで対象のクラスを選ぶ (エディタの場合、 カーソルを置く) - "Replace Inheritance with Delegation..."を実行

仲介人の削除(Remove Middleman)
デリゲートしている処理を、
// 呼び出し側
String str = new Foo().getBarValue();
// Foo.java
public String getBarValue() {
return bar.getString();
}
// 呼び出し側
String str = new Foo().getBar().getString();
// Foo.java
public String getBar() {
return bar;
}
シチュエーションが限定的過ぎて、
使い方
- 「Structureツールウィンドウ」
やエディタ上で、 デリゲート対象のインスタンス変数を選ぶ (エディタの場合、 カーソルを置く) - "Remove Middleman..."を実行

メソッドの戻り値をラップする(Wrap Method Return Value)
指定したメソッドの戻り値を新しいラッパークラスに置き換えるか、
使い方
- エディタで対象のメソッドにカーソルを置く
- "Wrap Method Return Value..."を実行

匿名クラスを内部クラスに変換(Convert Anonymous to Inner)
表題の通りです。
使い方
- 「Structureツールウィンドウ」
やエディタで匿名クラスを選ぶ (エディタの場合、 カーソルを置く) - "Convert Anonymous to Inner..."を実行

フィールドのカプセル化(Encapsulate Fields)
インスタンス変数に直接アクセスせず、
使い方
-
以下のいずれかの方法で対象を選ぶ
- エディタの場合、
フィールドそのものか、 そのフィールドを含むクラスにカーソルを置く - 「Projectツールウィンドウ」
の場合、 クラスを選ぶ - 「Structureツールウィンドウ」
の場合、 フィールドを1つまたは複数選ぶ
- エディタの場合、
- "Encapsulate Fields..."を実行

一時的な変数をクエリに置き換える(Replace Temp with Query)
この一見意味のわからないリファクタリングは、
使い方
- エディタ上で削除したい変数にカーソルを置く
- "Replace Temp with Query..."を実行

コンストラクタをファクトリメソッドに置き換える(Replace Constructor with Factory Method)
表題の通りです。コンストラクタの代わりに専用のファクトリメソッドを追加し、
使い方
- 「Structureツールウィンドウ」
やエディタでコンストラクタ定義が呼び出し部分を選ぶ (エディタの場合、 カーソルを置く) - "Replace Constructor with Factory Method..."を実行

コンストラクタをビルダに置き換える(Replace Constructor with Builder)
表題の通りです。コンストラクタをビルダメソッドに置き換えます。ビルダとはリスト3のようなクラスの事です。
// 使い方
// Foo foo = new FooBuilder().setA(10).setB(20).createFoo();
class FooBuilder {
int a, b;
FooBuilder setA(int a) { this.a = a; return this; }
FooBuilder setB(int b) { this.b = b; return this; }
Foo createFoo() { return new Foo(a, b); }
}
使い方
- 「Structureツールウィンドウ」
やエディタでコンストラクタ定義か呼び出し部分を選ぶ (エディタの場合、 カーソルを置く) - "Replace Constructor with Builder..."を実行

ジェネリクス化(Generify)
ジェネリクスが適用されていないコードを解析して、
使い方
- ジェネリクスの適用レベルに応じて、
以下の方法で対象を選ぶ 「Projectツールウィンドウ」 でディレクトリ、 パッケージ、 クラスを選択 - 「Structureツールウィンドウ」
でクラス、 メソッドを選択 - エディタでクラスやメソッドにカーソルを置くか、
任意の選択範囲を指定
- "Generify..."を実行

マイグレーション(Migrate)
古いパッケージやクラスを新しいものに移行します。このリファクタリングの歴史はとても古くSwing 1.
使い方
- 選択状態、
カーソル位置に関係なく"Migrate..."を実行

「Package and Class Migration」

Javaに変換する(Convert to Java)
GroovyのソースコードをJavaに変換します。Android StudioがGradleサポートをする都合でGroovyをサポートしているために付いてきているリファクタリングです。
Android StudioでGroovyを使うのは一筋縄ではいかないので、
使い方
- 「Projectツールウィンドウ」
でGroovyのソースコードを選択します (エディタの場合、 Groovyのソースコードを開いておく) - "Convert to Java"を実行

国際化(Internationalize)
Javaのソースコード中にハードコーディングしている文字列リテラルをリソースバンドルResourceBundle
)
純粋なJavaの開発ではリソースバンドルを用いて国際化を行うのが標準的ですが、strings.
を使うので、
使い方
- リソースバンドルに抜き出したい文字列リテラルにカーソルを置く
- "Internationalize..."を実行

スタイルのインライン化(Inline Style)
Android固有のリファクタリングです。style
属性)
使い方
- エディタ上でインライン化したいスタイル参照にカーソルを置く
- "Inline Style..."を実行

可能ならばスタイルを使用する(Use Style Where Possible)
Android固有のリファクタリングです。レイアウトリソースから既存のスタイルに置き換え可能な部分を探し出し、

使い方
styles.
をエディタで開き、xml スタイル適用させたいスタイルにカーソルを置く - "Use Style Where Possible..."を実行

可能ならばRTLサポートを追加する(Add RTL Support Where Possible)
Android固有のリファクタリングです。RTL
使い方
- 選択状態、
カーソル位置に関係なく"Add RTL Support Where Possible..."を実行

まとめ
リファクタリングメニューが多くて正直うんざりもしますが、
数年に1回しか使わないリファクタリングであっても、
リファクタリング実行も
最後にEclipseのリファクタリングとの対比を表1にまとめました。Eclipseから移行した方々の参考になれば幸いです。
Eclipseのリファクタリングメニュー | 「Refactor」 |
---|---|
"移動..." | "Move..." |
"メソッドの抽出..." | Extract → "Method..." |
"ローカル変数の抽出..." | Extract → "Variable..." |
"定数の抽出..." | Extract → "Constant..." |
"インライン化..." | "Inline..." |
"ローカル変数をフィールドに変換..." | Extract → "Fields..." |
"匿名クラスをネストに変換..." | "Convert Anonymous to Inner..." |
"型を新規ファイルに移動..." | "Move..." |
"スーパークラスの抽出..." | Extract → "Superclass..." |
"インターフェースの抽出..." | Extract → "Interface..." |
"使用可能な場合にスーパータイプを使用..." | "Use Interface Where Possible..." |
"プッシュ・ | "Push Members Down..." |
"プル・ | "Pull Members Up..." |
"クラスの抽出..." | Extract → "Delegate..." |
"パラメーター・ | Extract → "Parameter Object..." |
"間接参照の導入..." | ※該当無し |
"ファクトリーの導入..." | "Replace Constructor with Factory Method..." |
"フィールドのカプセル化..." | "Encapsulate Fields..." |
"宣言された型の一般化..." | ※該当無し (インテンションで代用可能) |
"総称型引数の推測..." | "Generify..." |
"JARファイルのマイグレーション..." | ※該当無し |
"スクリプトの作成..." | ※該当無し |
"スクリプトの適用..." | ※該当無し |
"ヒストリー..." | ※該当無し |