2009-11-13 3 views
18

저는 사람들이 어떻게 이것을 해결하는지 궁금합니다. 종종 같은 유형의 코드를 항상 작성합니다. 예를 들어,Java : 매크로가 지원됩니까?

new Thread() { 
    //... 
    //... 
    //... 
    //Change this line 
    //... 
    //... 
}.start(); 

"이 줄 바꾸기"라는 줄을 계속 변경하고 스레드를 시작합니다. 이 변경은 한 줄 또는 몇 줄 일 수 있습니다. 이 코드를 어떻게 압축할까요?

+0

다형성을 시도하십시오. –

+3

귀하의 질문에 대한 대답은 아니지만 일반적으로 확장 스레드보다 Runnable을 구현하는 것이 더 정확하다고 간주됩니다. 그 이유는 단순히 변경하려는 스레드 동작 (Runnable을 실행하는 스레드)이 아니라 실행중인 스레드 동작입니다. – Fredrik

답변

8

하나의 기술은 코드를 익명의 내부 클래스에 넣고 나머지는 수행하는 메서드로 전달하는 것입니다.

interface SomeInterface { 
    void fn(); 
} 

    executeTask(new SomeInterface { 
     public void fn() { 
      // Change this line. 
     } 
    }); 

private void executeTask(final SomeInterface thing) { 
    Thread thread = new Thread(new Runnable() { public void run() { 
     //... 
     //... 
     //... 
     thing.fn(); 
     //... 
     //... 
    }}); 
    thread.start(); 
} 

일반적으로 불필요한 경우 Thread 또는 다른 클래스를 확장하는 것은 좋은 생각이 아니다.

0

아니요, 매크로가 없습니다. 이 경우, 가장 가까운 사용자는 새로운 Runnable 인스턴스를 생성하여 자신이 생성 한 함수 또는 작업을 시작할 ExecutorService에 전달합니다.

Java에서는이 "상용구"코드를 제거하는 좋은 방법이 없습니다. 주로 포인터를 함수에 전달할 수 없기 때문입니다. 모든 것이 대상이어야합니다.

21

글쎄, 나는

+13

그것은 내가 들었던 가장 미친 물건이 아니다. 그러나 그것은 가까운 가까운 땅이다! –

+0

동의 - 예쁜 그림이 아닙니다. – gnud

+2

Hehe, 나는 그것을 좋아한다. –

7

그것은 상용구 코드를 생성하는 자바 주석을 사용하는 것이 가능 ... 당신은 C 프리 프로세서를 통해 자바 파일을 실행할 수 있습니다 같아요. 자신의 주석 프로세서를 작성하는 것은 어렵지 않습니다.

+0

+1 : 내 자신의 주석을 구현하는 트릭을 고수 할 것입니다. 그것에 대해 결코 생각하지 않았다. –

+4

어디를보아야하는지 알기는 어렵지 않지만 참조 링크 또는 2 개를 포함하는 것이 좋습니다. – Skrylar

0

스레드의 경우 Runnable을 구현하는 모든 개체를 해당 생성자로 전달할 수 있습니다.

그래서,이 솔루션은 자신의 클래스를 만드는 것입니다 :

불행하게도
public class MyClass implements Runnable { 
    void run() { 
     // change this line 
    } 
} 

먼저 MyClass의 인스턴스를 생성해야하므로, 실행은 정적되지 않습니다 :

new Thread(new MyClass()).start(); 

MyClass와 생성자에 변수를 추가하여 인수를 전달할 수도 있습니다.

편집 : 시작 방법 이외의 것이 필요한 경우 Thread 하위 클래스로 지정할 수도 있습니다.

19

template pattern을 사용하여 공통 코드가 포함 된 기본 클래스를 만들 수 있습니다. 예를 들어 : 그런 다음 상용구 코드와 스레드를 시작

public abstract class ThreadTemplate extends Thread 
{ 

    public void run() { 
     //reusable stuff 
     doInThread(); 
     //more resusable stuff 
    } 

    abstract void doInThread(); 

} 

만큼 간단합니다 : 당신의 IDE의 템플릿 기능을 사용하는 것도

new ThreadTemplate{ 
    void doInThread() { 
     // do something 
    } 
}.start(); 

이 덜 우아한 해결책이 자신에게 어떤 입력을 저장하는 것입니다 . Eclipse에서 설정하는 방법에 대한 정보는 here입니다. 유용한 목록은 Useful Eclipse Java Code Templates

+0

modded가 왜 안 좋을지 확신하지 못하는데, 그가 말한 것으로부터 // 그 라인이 일반적이라면 _exact_ 정답입니다. –

+1

맞춤법 오류가 있었는데 어쩌면 그게 맞습니까? –

+0

+1이 디자인 패턴에 대해 정말 좋아합니다 –

1

에서 찾을 수 있습니다. 예를 들어 이클립스를 사용하고 Window-> Preferences-> Java-> Editor-> Templates로 가면 자신 만의 템플릿을 설정 한 다음 자동으로 완성 할 수 있습니다. 예를 들어 나는 항상 sysout을 입력하고 Tab 키를 누르기 시작한다. eclipse에는 System.out으로 바꿀 수있는 템플릿이 내장되어있다.println();

이클립스의 많은 사전 구축 템플릿이 있습니다, 그래서 당신이 사용하는 IDE 경우이 아주이다 다른 IDE의

에서 비슷한 뭔가가있을 수없는 경우는, 구문에 대한 예제들에서 볼 수 있었다 유용하며, 많은 보일러 코드를 만들 수 있습니다.