문제

Lamdbaj는 Java 언어의 폐쇄 정의를 허용하며 다양한 예를 찾을 수 있습니다.여기

제 질문은 예를 들어, 예를 들어 println 클로저, 다음 코드가 사용됩니다.

Closure println = closure(); 
{ of(System.out).println(var(String.class)); }

이 폐쇄는 다음을 통해 다음을 통해 실행될 수 있습니다.

println.apply("foobar");

나는 Java의 메커니즘이 전화를 허용하는 것에 대해 궁금합니다. of(...).println(...) The와 관련이 있습니다 println 인스턴스 자체.

당연히 Lambdaj 소스 코드를 읽을 수 있지만 누군가가 있다면 약간 더 높은 수준의 설명을 기대하고있었습니다. 저의 반사 기술은 약간의 성찰과 실행 방법만큼 동적으로 진행됩니다.

도움이 되었습니까?

해결책

잘, of 아마도 a static 정적으로 가져 오는 메소드는 클래스 이름없이 호출 할 수 있습니다. 나는 그것을 기대한다 var 는 똑같은. 두 방법 모두 다음에 호출되는 방법을 반환해야합니다.

public class Printable {
  public void println(Var var);
}

public class Fac {
  public static Printable of(Object o) {
    return new Printable(o);
  }

  public static Var var(Class<?> clazz) {
    return new Var(clazz);
  }

} 

갑자기:

Fac.of(System.out).println(Fac.var(String.class));

유효한 Java입니다. 정적 가져 오기, Hey Presto :

import static Fac.*;

of(System.out).println(var(String.class));

곱슬 머리는 어휘를 정의하는 데 도움이되기 위해 어떤 방법 으로든 추가 할 수 있기 때문에 분명히 유효한 Java입니다. 이 API 디자인 스타일을 호출합니다 유창한 그리고 가장 잘 보여줍니다 jmock 테스트 라이브러리.

그건 그렇고, 이것이 Java에 폐쇄를 도입해야한다면, 그것은 매우 말도 안됩니다 - 구문은 읽을 수 없을 정도로 끔찍합니다. 그들의 I/O 예는 실제로 나를 크게 웃게 만들었습니다. 노력하다 스칼라!

편집하다 - 둘 println 첫 번째 호출 시퀀스로 인해 라이브러리가 매개 변수로 전달한 변수를 캡처 할 수 있기 때문에 호출은 관련이 있습니다. 이것들은 아마도 일부에서 캡처 될 것입니다 ThreadLocal 구조. 그런 다음 A를 호출 할 때 (아마도 정적) println 방법, 라이브러리는이 캡처 된 데이터를 사용하여 나중에 동작을 실제로 실행합니다. 또한 테스트와 관련하여 EasyMock 테스트 프레임 워크는 유사한 메커니즘 (백그라운드에서 Java 프록시를 사용)을 사용하여 예상 값을 캡처합니다.

다른 팁

저는 Mario Fusco이고 Lambdaj 도서관의 주요 개발자입니다.

우선 나는 무언가를 명확히하고 싶습니다. Lambdaj는 기능적 언어를 대체하기위한 것이 아닙니다. 지난주에 스칼라를 사용할 기회가 있다면 지난주에 취리히 주전자에서 연설에서 말했듯이, 가서 뒤돌아 보지 마십시오. 여기에서 당신은 내 연설 이력서를 찾을 수 있습니다.

http://ctpjava.blogspot.com/2009/10/lambdaj-new-trend-in-java.html

나도 행복한 스칼라 개발자입니다. 그러나 때때로 당신은 자바에서 발전해야 할 의무가 있습니다 (내 경험, 실제 세계에서는 코드를 작성 해야하는 언어를 선택할 수없는 80% 정도)이 경우 Lambdaj 기능 중 일부는 도움이되거나 희망합니다. 나는 단지 완전히 누락 된 기능적 기능을 Java에 가져오고 싶었습니다. 물론 결과는 주로 Java 자체가 부과 한 제한으로 인해 완전히 만족하지 않습니다.

내부 Lambdaj 메커니즘은 그렇습니다. 그 결과를 달성하기 위해 스레드 로컬을 사용합니다. Lambdaj에 대한 다른 질문, 호기심 또는 더 나은 제안 및 건설적인 비평가가 있다면 Lambdaj 메일 링리스트에 자신을 등록하는 데 관심이있을 수 있습니다.

http://groups.google.com/group/lambdaj

안녕 마리오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top