[java] 매개 변수로 실행할 수 있습니까?

그런 실행 파일이 실제로 존재하지 않는다는 것을 알고 있지만 “매개 변수를 허용하는 실행 파일”이 필요합니다.

이것은 내 앱 디자인 및 / 또는 피곤한 두뇌의 정신적 블록에 근본적인 결함을 지적 할 수 있으므로 기본적인 OO 원칙 위반 하지 않고 다음과 같은 것을 달성하는 방법에 대한 조언을 찾고 싶습니다 .

  private Runnable mOneShotTask = new Runnable(String str) {
    public void run(String str) {
       someFunc(str);
    }
  };  

위와 같은 것을 성취하는 방법에 대한 아이디어가 있습니까?



답변

글을 올린 지 9 년이 지났지 만 솔직히 말해서 Java는 그 이후로 몇 가지 개선을했습니다. 나는 원래의 대답을 아래에 남겨 둘 것이지만, 사람들이 그 안에있는 것을 할 필요는 없다. 9 년 전 코드 검토 중에 왜 그들이 그것을했는지, 아마도 승인하지 않았는지 질문했을 것입니다. 현대 람다를 사용할 수 있으면 구식 접근 방식을 권장하는 투표가 많은 답변을 얻는 것은 무책임합니다. 제안 :

void foo(final String str) {
    Thread t = new Thread(() -> someFunc(str));
    t.start();
}

이전과 마찬가지로, 스레드를 의미있는 방식으로 처리하는 것과 같은 세부 사항은 독자에게 연습으로 남아 있습니다. 그러나 람다 사용을 두려워한다면 멀티 스레드 시스템을 더 두려워해야합니다.

원래 답변 :

메소드에서 클래스를 바로 선언 할 수 있습니다

void Foo(String str) {
    class OneShotTask implements Runnable {
        String str;
        OneShotTask(String s) { str = s; }
        public void run() {
            someFunc(str);
        }
    }
    Thread t = new Thread(new OneShotTask(str));
    t.start();
}


답변

함수에 넣을 수 있습니다.

String paramStr = "a parameter";
Runnable myRunnable = createRunnable(paramStr);

private Runnable createRunnable(final String paramStr){

    Runnable aRunnable = new Runnable(){
        public void run(){
            someFunc(paramStr);
        }
    };

    return aRunnable;

}

(이 매개 변수를 사용할 때 내 매개 변수는 정수 ID로 ID-> myRunnables의 해시 맵을 만드는 데 사용되었습니다. 이렇게하면 해시 맵을 사용하여 처리기에서 다른 myRunnable 객체를 게시 / 제거 할 수 있습니다.)


답변

theView.post(new Runnable() {
    String str;
    @Override
    public void run() {
        par.Log(str);
    }
    public Runnable init(String pstr) {
        this.str=pstr;
        return(this);
    }
}.init(str));

객체 자체를 반환하고 매개 변수를 사용하여 초기화하는 초기화 함수를 만듭니다.


답변

Runnable 인터페이스 를 구현하는 다음 클래스를 사용합니다 . 이 클래스를 사용하면 인수로 새 스레드를 쉽게 만들 수 있습니다

public abstract class RunnableArg implements Runnable {

    Object[] m_args;

    public RunnableArg() {
    }

    public void run(Object... args) {
        setArgs(args);
        run();
    }

    public void setArgs(Object... args) {
        m_args = args;
    }

    public int getArgCount() {
        return m_args == null ? 0 : m_args.length;
    }

    public Object[] getArgs() {
        return m_args;
    }
}


답변

두 가지 옵션이 있습니다.

  1. 명명 된 클래스를 정의하십시오. 명명 된 클래스의 생성자에 매개 변수를 전달하십시오.

  2. 익명 클래스를 “매개 변수”에 가깝게하십시오. 로 표시해야합니다 final.


답변

Java 8부터 가장 좋은 대답은 다음을 사용하는 것입니다 Consumer<T>.

https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html

기능 인터페이스 중 하나입니다. 람다 식으로 호출 할 수 있습니다.

void doSomething(Consumer<String> something) {
    something.accept("hello!");
}

...

doSomething( (something) -> System.out.println(something) )

...


답변

먼저 new Runnable () 또는 run ()에 전달할 인수가 필요하기 위해 여기서 달성하려는 것이 무엇인지 알고 싶습니다. 일반적인 방법은 시작하기 전에 멤버 변수를 설정하여 데이터 (str)를 스레드에 전달하는 Runnable 객체를 가져야합니다. 그런 다음 run () 메소드는 이러한 멤버 변수 값을 사용하여 someFunc ()를 실행합니다.