2010-02-07 3 views
11

Java 클로저의 현재 사양은 무엇입니까? 제안 된 자바 폐쇄 사양에서Java 클로저 유형, 변수, 배열 및 컬렉션

  1. , 우리는 폐쇄의 배열이나 컬렉션을 만들 수 있을까?
    그렇다면이 구문을 사용할 수 있습니까?

    {int x, int y => boolean b}[] comparisonSwitch = { 
        {int i, int j => return i>j}, 
        {int i, int j => return j<i}, 
        {int i, int j => return j==i} 
    } 
    
    boolean compare(int acase, int a, int b){ 
        return comparisonSwitch[acase].invoke(a,b); 
    } 
    
  2. 정상적인 방법은 비 익명 폐쇄로 간주됩니까?
    그러면 다음 구문을 사용할 수 있습니까?

    public class Asdf 
    { 
        public boolean gt(int x, int y){ 
        return x>y; 
        } 
        public boolean lt(int x, int y){ 
        return x<y; 
        } 
        public boolean eq(int x, int y){ 
        return x==y; 
        } 
    
        {int x, int y => boolean b} GT = gt; 
        {int x, int y => boolean b}[] comparisonSwitch = { 
        gt, lt, eq 
        } 
    } 
    
  3. 즉, 운영 체제와 상호 교환 가능한 클로저 및 방법은 무엇입니까?
    다음 구문을 사용할 수 있습니까?

    // declare a method that has a closure type as an argument 
    void closurator({String s => int a} findlen){ 
        // do whatever 
    } 
    String s = "hello"; 
    void useClosurator(){ 
        // invoke the method by supplying a non-anonymous method 
        // of an object 
        closurator(s.indexOf(String ss)); 
    } 
    
  4. 인터페이스에서 클로저 유형을 어떻게 지정할 수 있습니까?
    메소드에 대한 최종/상수 참조를 효과적으로 선언하여 다음 작업을 수행 할 수 있습니까? 폐쇄 코드 공간에 액세스 것 때문에

    interface Closuration 
    { 
        public class Asdf 
        { 
        static public boolean gt(int x, int y){ 
         return x>y; 
        } 
        static public boolean lt(int x, int y){ 
         return x<y; 
        } 
        static public boolean eq(int x, int y){ 
         return x==y; 
        } 
        } 
    
        {int x, int y => boolean b}[] comparisonSwitch = { 
        Asdf.gt, Asdf.lt, Asdf.eq 
        }; 
    } 
    
  5. , 반사, 폐쇄 사용하는 것이하는 것처럼 프로그램의 성능이 저하? 그렇지 않다면, "폐쇄 기술"에서 이루어진 진보를 빌리 자면 그 반성이 가속화 될 것인가? 내가 그 폐쇄 코드는 바로, 가비지 수집 닦아에 취약 할 것이라고 예측하고 있기 때문에, 는 사실, 폐쇄 코드는 코드 공간 또는 변수 힙의 일부가 될 것입니다 :

새로운 질문을 삽입?

예제 코드의 구문 오류/오타/누락 된 키워드가 아닌 질문의 요점에 초점을 맞추어달라고 요청할 수 있습니다. 어떤 오타/오류라도 나를 바로 잡으십시오. 고맙습니다.

+0

"진정한 질문이 아님"으로이 질문을 끝내기가 너무 성급한 분이라면 http://stackoverflow.com/questions/2198734/demonstrate-prove-that에서 내 자신의 의견을 읽어보십시오. -heap-sort-is-on-log2n-time-closed : 숙제가 아닙니다. 일부 전략 결정을 내리기 위해 정직한 도움이 필요한 50 세의 고대 프로그래머. –

+0

Neal Gafter의 폐쇄 제안이나 현재 토론중인 람다에 대한 질문입니까? –

+0

현재 프로젝트 람다 : Java 언어 사양 초안 0.1 http://mail.openjdk.java.net/pipermail/lambda-dev/attachments/20100122/3764c21a/attachment.txt 버전 0.2가 준비 중입니다. –

답변

12

javac.info에 대한 참조는 관련이 없으므로 JDK7 클로저 작업에 대해 질문합니다. 이 사이트는 현재 openjdk 클로저 프로젝트 인에 대해 투명한 클로저를 Java 투명성에 추가하는 방법을 보여주었습니다. 투명성은 Tennent의 통신 원리를 만족시키는 의미에서 사용되었으며 대략 my blog에 설명되어 있습니다.

JKD7의 노력은 openjdk lambda project으로 구성되어 있습니다. 명세는 급속한 진화를 겪고 있으므로 어떤 대답도 시험 적이다. Tom Hawtin이 지적한대로 here is the latest draft spec.

구체적인 질문에 답하기 전에 Java에 변수와 메서드에 대한 별도의 네임 스페이스가 있음을 확인하는 것이 좋습니다. 결과적으로 메서드를 호출하고 함수 형식의 변수를 호출하는 것 (C# 구문, 대리자)과 구문적인 구별이있을 수 있습니다. 마찬가지로 필드를 참조하는 것처럼 이름을 지정하여 메서드를 참조 할 수는 없습니다.

귀하의 질문에 대답하려면

기능 유형에 대한 제안 구문 아니다
  1. . 이 문제를 제쳐 놓고, 일련의 함수 유형을 갖는 것이 합법적인지 궁금해 할 것입니다. 현재의 초안 명세서는 대답이 '예'라고 제안하지만 알려진 기능 구현 전략은 "함수 유형의 배열"이 어떻게 든 허용되지 않는 한 유형 시스템에 구멍이 생길 수 있습니다. 초안 표준은 구현 전략을 논의하는 것을 신중하게 피합니다. 이러한 문제를 해결하기 위해 VM 사양을 변경할 수도 있습니다. 내가 추측해야만한다면, 당신의 질문에 대한 대답은 "아니오"라고 생각합니다. 그러나 배열 대신 java.util.List을 사용하여 동일한 효과를 얻을 수 있습니다. 별도의 project CoinList에 대해 Collection 리터럴 및 인덱싱 작업을 추가하려는 경우 구문 적으로는 편리 할 것입니다.
  2. 메서드 이름을 지정하여 함수 값을 갖는 식을 만들지 궁금합니다. Java에서 다른 메서드 이름과 변수가 다른 이름 공간에 표시되기 때문에 대답은 '아니오'입니다. 그러나 메서드 이름을 함수 값을 갖는 식으로 처리하도록 요구하는 특정 구문을 사용하여 사양을 확장 할 수도 있습니다. Stephen Colebourne이 제안한 구문을 사용하여 Closures for Java (v0.6a) 문서의 Method References 섹션을 참조하십시오. 이것은 프로젝트 람다 초안에 아직 없습니다.
  3. (2)에 대한 답변을 참조하십시오.
  4. (2)에 대한 답변을 참조하십시오.
  5. 성능에 대해 걱정이됩니다. 간단히 말하면, 클로저는 메소드보다 호출 비용이 많이 들게하는 기법으로는 구현되지 않을 가능성이 있습니다. 성능상의 이유로 VM을 변경하지 않아도되지만 다른 이유로는 VM 변경이 필요하지 않습니다 (대답 1 참조). BGGA 프로토 타입에 대한 포인터는 the Closures Project homepage을 참조하십시오. 더 야심적인 클로저 스펙은 jdk5/jdk6 주식에서 실행되며 성능을 측정 할 수 있습니다.
1

JDK7의 클로저는 현재 자세히 설명되어 있지 않습니다. Devoxx의 프리젠 테이션에서 사용 된 예제는 FCM closures proposal과 매우 유사합니다.

스펙이 JDK7에서 사용된다고 가정하면, 파트 2, 파트 3 및 파트 4에 대한 응답은 예 (비록 잘못 될 수 있지만)라고 생각합니다.

파트 1의 경우 메서드 리터럴이 Method 개체에 할당되므로 배열을 사용할 수 있어야한다고 생각합니다.

5 부에서는 퍼포먼스가 내부 클래스와 유사하다고 생각합니다.

죄송합니다. 약간 모호합니다. 조금 도움이 되었기를 바랍니다. 귀하의 질문에 확실하게 답변하는 것은 아직 이른시기입니다.

+0

구문은 FCM (해시 문자 사용)과 유사합니다. 실제 제안은 매우 달랐습니다. –