2016-06-05 2 views
0

저는 Java에 익숙하지 않고 특정 그룹 ID에 따라 함수를 인스턴스화하는 방법을 알아 내려고합니다. 나는 파이썬 배경에서 왔고, 이것이 어떻게 파이썬으로 할 수있는가이다.파이썬에서와 같이 자바에서 함수 인스턴스화하기

if (self.groupid == GROUPID_LUT.one): 
    self.group_cb = self._one_cb 

elif (self.groupid == GROUPID_LUT.two): 
    self.group_cb = self._two_cb 

elif (self.groupid == GROUPID_LUT.three): 
    self.group_cb = self._three_cb 

elif (self.groupid == GROUPID_LUT.four): 
    self.group_cb = self._four_cb 

else: 
    sys.stderr.write("ERROR: Could not obtain group ID.") 
    exit(-1) 

그래서 어디서나 self.group_cb를 호출 할 수 있으며 초기화 된 함수를 호출 할 수 있습니다.

Java로 가능합니까? 아니면 파이썬에만 해당되는 것입니까?

감사합니다.

+1

Java 방식을 사용하십시오. 인터페이스를 만들고 네 개의 별개 클래스 (익명 클래스 또는 람다)로 구현하십시오. 생성자에서 참조를 인스턴스화하고 할당합니다. –

+0

가장 가까운 것은 https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html이지만 Java에는 실제 함수 유형이 없습니다. – zapl

답변

0

정확히 같은 방식으로 수행 할 방법은 없지만 수행중인 작업에 따라 몇 가지 방법이 있습니다. 가장 직접적인 것은 이것입니다.

정의 인터페이스 :

public interface I { 
    void cb(); 
} 

각 그룹 ID 다르게 그 인터페이스를 구현 : 같은이 달성하기 위해

I i; 
switch(groupid) { 
    case GROUPID_LUT.one: 
     i = new One(); 
     break; 
    case GROUPID_LUT.two: 
     i = new Two(); 
     break; 
    case GROUPID_LUT.three: 
     i = new Three(); 
     break; 
    case GROUPID_LUT.four: 
     i = new Four(); 
} 
i.cb(); 

더 짧은 방법 :

public class One implements I { 
    @Override public void cb() { ... } // implementation _one_cb 
} 

public class Two implements I { 
    @Override public void cb() { ... } // implementation _two_cb 
} 

public class Three implements I { 
    @Override public void cb() { ... } // implementation _three_cb 
} 

public class Four implements I { 
    @Override public void cb() { ... } // implementation _four_cb 
} 

그래서 당신이 그것을 사용 익명의 클래스를 사용하는 것 (인터페이스의 정의는 여전히 필요하다) :

마지막으로
I i; 
switch(groupid) { 
    case GROUPID_LUT.one: 
     i = new I() { 
      @Override public void cb() { ... } 
     }; // implementation _one_cb 
     break; 
    case GROUPID_LUT.two: 
     i = new I() { 
      @Override public void cb() { ... } 
     }; // implementation _two_cb 
     break; 
    case GROUPID_LUT.three: 
     i = new I() { 
      @Override public void cb() { ... } 
     }; // implementation _three_cb 
     break; 
    case GROUPID_LUT.four: 
     i = new I() { 
      @Override public void cb() { ... } 
     }; // implementation _four_cb 
} 
i.cb(); 

위의 자바 8과 같은를 달성하기 위해 가장 짧은 방법은 lambda를 사용하는 것입니다,하지만 그 기능이 무엇을하고 있는지에 대한 자세한 정보가 필요합니다.

+0

고마워요. 제 이해는 방법. 함수를 재정의 (override) 할 수 있다는 사실을 악용하고 새로운 콜백으로 인터페이스 메소드를 오버라이드 할 수 있습니까? 모든 콜백이 동일한 인수를 가져야하거나 동일한 값을 반환해야한다고 생각합니다. 인수를 전달하거나 값을 반환하는 경우? – Sam

0

자바는 본래 일류 함수 (데이터로서의 기능)를 가지고 있지는 않지만 기능 인터페이스의 개념을 가지고 있습니다. 특히 Java 8에서는 기능처럼 작동합니다. 기능 인터페이스의 개념은 간단합니다. 하나를 정의하려면, 당신이 할 일은과 같이, 단 하나의 방법으로 인터페이스를 제공하는 것입니다 :

public interface MyFunctionalInterface { 
    public void process(); 
} 

당신은 선택적으로 클래스의 앞에 주석 @FunctionalInterface을 배치 할 수 있습니다; 클래스에 둘 이상의 메소드가있는 경우 컴파일 오류가 발생합니다. 그런 다음 그 하나의 방법 (따라서 '호출'기능 인터페이스),이 인터페이스의 서브 클래스를 생성 서브 클래스의 변수를 생성하고 호출 할 수 있습니다 ... 다른

public class MyFunctionalClass implements MyFunctionalInterface { 
    @Override 
    public void process() { 
     System.out.println("Processed"); 
    } 
} 

... 어딘가를

MyFunctionalInterface func = new MyFunctionalClass(); 
func.process(); 

첫 번째 클래스 기능을 시뮬레이트합니다.
익명 클래스로,이 작업을 수행하기위한 일반적인 방법입니다 :

MyFunctionalInterface func = new MyFunctionalInterface() { 
    @Override 
    public void process() { 
     System.out.println("Processed"); 
    } 
}; 
func.process(); 

그리고 자바 8

, 당신에게, 더욱이 단축 될 수 있습니다 :이 구문으로

MyFunctionalInterface func =() -> { System.out.println("Processed"); }; 
func.process(); 

사이에 넣어 () 매개 변수 의 이름이입니다. 컴파일러가 그것들을 알고 있기 때문에 타입의 이름을 지정할 필요가 없습니다!
는 따라서 group_cb에 대한 부모의 인터페이스를 선언하고이 작업을 수행 할 수 있습니다

if (groupid == GROUPID_LUT.one) 
    group_cb = _one_cb; 

else if (groupid == GROUPID_LUT.two) 
    group_cb = _two_cb; 

else if (groupid == GROUPID_LUT.three) 
    group_cb = _three_cb; 

else if (groupid == GROUPID_LUT.four) 
    group_cb = _four_cb; 

else { 
    System.err.println("ERROR: Could not obtain group ID."); 
    System.exit(-1); 
} 

면책 조항 :이 코드 중 어느 것도 테스트하거나 실행되었습니다.