目新しいこと何もなし。
ちょっと挙動が気になったので。
まずは普通に。
public static void main(String[] args) { int a = 1;//ここを抽出 }
public static void main(String[] args) { hoge(); } private static void hoge() { int a = 1; }
変数aは戻ってこない。
変数aを使用してみる。
public static void main(String[] args) { int a = 1;//ここを抽出 System.out.println(a); }
public static void main(String[] args) { int a = hoge(); System.out.println(a); } private static int hoge() { int a = 1; return a; }
変数aが戻ってきた。
変数を増やす。
public static void main(String[] args) { int a = 1; int b = 1; a = 2;//ここを抽出 b = 2;//ここを抽出 System.out.println(a); }
public static void main(String[] args) { int a = 1; int b = 1; a = hoge(); System.out.println(a); } private static int hoge() { int a; int b; a = 2; b = 2; return a; }
使われている変数aだけ戻ってきた。
bも使ってみる。
public static void main(String[] args) { int a = 1; int b = 1; a = 2;//ここを抽出 b = 2;//ここを抽出 System.out.println(a); System.out.println(b); }
2つリターンできないと言って怒られた。
インクリメント
public static void main(String[] args) { int a = 0; a++;//ここを抽出 System.out.println(a); }
public static void main(String[] args) { int a = 0; a = hoge(a); System.out.println(a); } private static int hoge(int a) { a++; return a; }
代入文に置き換わった。
副作用
private static int a = 0; public static void main(String[] args) { a = 1;//ここを抽出 System.out.println(a); }
private static int a = 0; public static void main(String[] args) { hoge(); System.out.println(a); } private static void hoge() { a = 1; }
aを返さずに直接staticフィールドを書き換えた。
継承関係にある二つの例外を投げる
public static void main(String[] args) { try { // ここから if(args == null){ throw new IOException(); }else{ throw new Exception(); } // ここまでを抽出 } catch (Exception e) { e.printStackTrace(); } }
public static void main(String[] args) { try { hoge(args); } catch (Exception e) { e.printStackTrace(); } } private static void hoge(String[] args) throws IOException, Exception { if(args == null){ throw new IOException(); }else{ throw new Exception(); } }
ちゃんとthrowsに両方書いてくれた。
途中でリターン
public static void main(String[] args) { // ここから if(args == null){ return; } System.out.println("めりくり"); // ここまで抽出 }
public static void main(String[] args) { hoge(args); } private static void hoge(String[] args) { if(args == null){ return; } System.out.println("めりくり"); }
元のメソッドではリターンしていない。
抽出箇所を変えてみる
public static void main(String[] args) { // ここから if(args == null){ return; } // ここまで抽出 System.out.println("めりくり"); }
何やら警告が出た後、
public static void main(String[] args) { hoge(args); System.out.println("めりくり"); } private static void hoge(String[] args) { if(args == null){ return; } }
こうなった。リファクタリングできていない。
以上。