はじめに
今回は、
リネーム(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ファイルのマイグレーション..." | ※該当無し | 
| "スクリプトの作成..." | ※該当無し | 
| "スクリプトの適用..." | ※該当無し | 
| "ヒストリー..." | ※該当無し | 
