読者です 読者をやめる 読者になる 読者になる

ジンジャー研究室

長めのつぶやき。難しいことは書きません。

Eclipseの「メソッドの抽出」機能で遊んでみた(Java)。

目新しいこと何もなし。
ちょっと挙動が気になったので。

まずは普通に。

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;
  }
}

こうなった。リファクタリングできていない。

以上。