|
이 섹션은 Make Method Static 리팩토링 위에서 overview를 제공하고 how 이 리팩토링이 IntelliJ
IDEA에서 사용될 수 있는가를 제공합니다.
Make Method Static 리팩토링은 이 메소드를 다른 클래스로 이동하는Move
Members 리팩토링에 대한 예비의 단계 뿐만아니라 클래스 인스턴스를 생성하지 않고 이 메소드를 유용한 기능으로 만들기 위해 비정적인 메소드를 정적인 것으로 변환하는데 사용된다. 타겟 메소드가 정적으로 선언될 리팩토링 이후, 그리고 어느 것이 있다면 클래스로부터 필요한 매개 변수는 추가될 것입니다.
예를 들면, 다음 코드가 리팩토링 이전에 있습니다. 당신은 두 개의 클래스를 가집니다:
public class ConnectionPool{
HashMap mPool;
Connection getConnection(String name){
return (Connection) mPool.get(name);
}
}
public class Processor{
ConnectionPool myCP;
void detach(String name){
myCP.getConnection(name).abortConnection();
}
}
그리고 그것은 getConnection 메소드를 정적으로 만들기에 쉽습니다. 당신의 선택에 따라, 리팩토링은 다음 두 개의 결과 중의 한 개를 갖고 나갈 수 있습니다:
만일 당신이 클래스 인스턴스를 참조하는 매개 변수를 필요로 하면:
public class ConnectionPool{
HashMap mPool;
static Connection getConnection(ConnectionPool connectionPool, String name){
return (Connection) connectionPool.mPool.get(name);
}
}
public class Processor{
ConnectionPool myCP;
void detach(String name){
ConnectionPool.getConnection(myCP, name).abortConnection();
}
}
또는 당신이 매개 변수로서 비 정적인 필드를 통과하고 싶어한다면:
public class ConnectionPool{
HashMap mPool;
static Connection getConnection(HashMap mPool1, String name){
return (Connection) mPool1.get(name);
}
}
public class Processor{
ConnectionPool myCP;
void detach(String name){
ConnectionPool.getConnection(myCP.mPool, name).abortConnection();
}
}
메소드를 정적으로 만들기 위해, 첫 번째로 캐럿을 선언 위의 에디터 또는 당신이 정적으로 되기를 원하는 메소드의 콜을 설정하십시오.

메인 메뉴에서 또는 에디터에서 오른쪽 버튼을 클릭하는 것에 의해 불려지는 팝업 메뉴에서 Refactor
| Make
Method Static... 을 클릭하십시오.
만일 메소드가 어떤 클래스 구성 요소를 사용하면 다음의 Introduce Parameter 다이얼로그가 나타납니다:

다이얼로그는 다음의 제어를 가집니다:
|
이름이 있는 매개 변수로서의 객체 추가
|
|
만일 체크하면, 메소드 선언과 콜로 매개 변수로서의 클래스 인스턴스를 추가합니다.
|

|
만일 타겟 메소드가 그 클래스의 비 정적인 메소드를 사용하면 이 체크 박스는 자동적으로 선택됩니다.
만일 당신이 그런 비 정적인 메소드를 위해 체크 박스를 해제하면 Problems
Detected 다이얼로그와 함께 경고 받게 될 것 입니다. 만일 당신이 그것을 무시하고 Continue를 누르면 리팩토링은 적용될 것이나 결과 코드는 컴파일이 안될지도 모릅니다.
|
|
|
필드에 대한 매개 변수 추가
|
|
만일 체크하면 메소드에 의해 사용되는 필드의 목록을 사용 가능하게 합니다.
목록에서 당신은 메소드에 매개 변수로서 넘어가는 비 정적인 필드를 메소드 선언/콜에서 필드의 순서를 변경하는 Move Up / Move
down 버튼을 사용하여 선택하거나/선택하지 않을 수 있습니다.
|

|
만일 타겟 메소드가 그 클래스의 비 정적인 필드를 사용하면 이 체크 박스는 자동적으로 선택됩니다.
만일 당신이 그런 비 정적인 필드를 위해 체크 박스를 해제하면 리팩토링은 적용될 것이나 결과 코드는 컴파일이 안될지도 모릅니다.
|
|

|
만일 당신이 타겟 메소드에 의해 사용하는 비 정적인 필드를 선택 해제하면 Problems
Detected 다이얼로그와 함께 경고 받게 될 것 입니다. 만일 당신이 그것을 무시하고 Continue를 누르면 리팩토링은 적용될 것이나 결과 코드는 컴파일이 안될지도 모릅니다.
|
|
|
변경된 미리 보기 사용
|
|
이 체크 박스를 선택하면 당신은 어떤 사용이 발견되었는지 추적하고, 그들의 교체를 승인하도록 허락합니다.
이 체크 박스가 선택되지 않을 때, IDEA는 교체를 자동적으로 수행합니다.
|

|
심지어 체크 박스가 선택되지 않았을 때도, 만일 발견된 사용이 어떤 읽기 전용 파일에서 존재하면 당신은 사용 교체를 확인하는 프롬프트가 당신에 대기될 것 입니다.
|
|
|
만일 클래스 구성 요소의 어느 것도 타겟 메소드에 의해 사용되지 않으면, Make
Method Static 는 다음과 같이 보일 것입니다:

그것은 두 체크 박스를 가집니다:
|
Replace usage qualifiers
with class references
|
만일 체크되면, 클래스 이름과 함께 클래스 사용 수식어를 교체합니다.
|
|
Preview usages to
be changed
|
위를 보십시오.
|
|
Make Method Static 리팩토링을 적용하면 당신은 가능한 부작용을 알고 있어야만 합니다. 만일 프로세서 클래스에서라면 당신은 다음의 코드를 가집니다:
public class Processor{
void detach(String name){
ArrayList connectionPools = new ArrayList();
for (Iterator iterator = connectionPools.iterator(); iterator.hasNext();) {
((ConnectionPool) iterator.next()).getConnection(name).abortConnection();
}
}
}
리팩토링 후에 코드가 있습니다:
public class Processor{
void detach(String name){
ArrayList connectionPools = new ArrayList();
for (Iterator iterator = connectionPools.iterator(); iterator.hasNext();) {
ConnectionPool.getConnection(((ConnectionPool) iterator.next()).aInt,
((ConnectionPool) iterator.next()).mPool, name).abortConnection();
}
}
}
당신이 볼 수 있는 것에 따라, iterator 는 실제로 잘못된 필드의 각각에 대해 두 배로 늘어납니다. 그러나, IDEA는 증분/감량/대입 연산으로서의 그런 경우를 임시 변수를 사용하고 new 키워드를 사용하여 성공적으로 문제를 해결할 수 있습니다.
예를 들면:
public class Processor{
void detach(String name){
new ConnectionPool().getConnection(name).abortConnection();
}
}
그리고 여기에 리팩토링 후의 코드가 있습니다.
public class Processor{
void detach(String name){
final ConnectionPool connectionPool = new ConnectionPool();
ConnectionPool.getConnection(connectionPool.aInt, connectionPool.mPool, name).abortConnection();
}
}
임시 변수는 비 정적인 필드에 대한 ConnectionPool 클래스의 두 개의 다른 인스턴스의 생성을 피하기 위해 생성됩니다
|