クラスへの抽出リファクタリング
IntelliJ IDEA を使用すると、フィールド、メソッド、パラメーターを新しいクラスに抽出するリファクタリングを使用できます。 これらのリファクタリングは、クラスが大きくなりすぎて「実行することが多すぎる」場合に役立ちます。 このような場合は、クラスをより小規模でまとまりのあるクラスに分割するとよいでしょう。
クラスに抽出するコードフラグメントを選択します。
抽出する内容に応じて、次のいずれかに移動します。
開いたダイアログで、新しいクラス、メソッド、パラメーターオプションの名前を指定します。
変更内容をプレビューし、 OK をクリックします。
デリゲート抽出例
委譲の抽出リファクタリングでは、クラスのいくつかのフィールドとメソッドを新しく作成した別のクラスに抽出できます。
前 | 後 |
|---|---|
public class Foo {
private String b;
public String getInfo() {
return ("(" + b + ")");
}
...
}
public class Bar {
Foo foo;
String t2 = foo.getInfo();
...
}
|
public class Foo {
private final Info info = new Info();
public String getInfo() {
return info.getInfo();
}
...
}
public class Info {
private String b;
public Info() {}
public String getInfo() {
return ("(" + b + ")");
}
}
public class Bar {
Foo foo;
String t2 = foo.getInfo();
...
}
|
メソッドオブジェクト抽出例
メソッドオブジェクトの導入 リファクタリングメソッドを新しいクラスに移動し、すべてのローカル変数をそのフィールドに変換し、メソッドを同じオブジェクト上の他のメソッドに分解できるようにします。 これは メソッドの抽出 の代替で、抽出されたメソッドに複数の戻り値がある場合に使用できます。
前 | 後 |
|---|---|
class Account {
int gamma (int val1, ...) {
//some computations
return c-2*a;
}
}
|
class Account {
int gamma (int val1, ...) {
Calculations calculations = new Calculations(val1, ...).invoke();
int c = calculations.getC();
int a = calculations.getA();
return c-2*a;
}
private class Calculations {
private int val1;
...
private int a;
private int c;
public Calculations(int val1, ...) {
this.val1 = val1;
...
}
public int getA() {return a;}
public int getC() {return c;}
public Calculations invoke() {
...//computations
return this;
}
}
}
|
パラメータオブジェクト抽出例
パラメーターオブジェクトの導入リファクタリングでは、メソッドのパラメーターセットを選択し、それらのパラメーターのラッパークラスを作成するか、既存の互換ラッパークラスを使用できます。 選択されたメソッドへのすべての呼び出しは、パラメーターが適切にラップされ、ラップされたパラメーターのすべての用途は、新しく作成されたパラメータークラスの適切な呼び出しによって置き換えられます。
前 | 後 |
|---|---|
public class A {
private void drawEdge(Graphics g, float edgeWidth,
int x1, int x2, int y1, int y2) {
final Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(new BasicStroke(edgeWidth));
g.drawLine(x1, y1, x2, y2);
}
}
|
public class A {
private void drawEdge(Edge edge, Graphics g) {
final Graphics2D g2d = (Graphics2D) g;
g2d.setStroke(new BasicStroke(edge.getEdgeWidth()));
g.drawLine(edge.getX1(), edge.getY1(), edge.getX2(), edge.getY2());
}
}
public class Edge {
private final float edgeWidth;
private final int x1;
...
public Edge(float edgeWidth, int x1, int x2, int y1, int y2) {
this.edgeWidth = edgeWidth;
this.x1 = x1;
...
}
public float getEdgeWidth() {
return edgeWidth;
}
public int getX1() {
return x1;
}
...
}
|
2026 年 3 月 30 日