폐쇄 란 무엇입니까? Java 7에 포함되어야합니다. (클로저는 Java 7에 포함되도록 논의되었지만 결국에는 포함되지 않았습니다. -ed) 클로저에 대해 배울 수있는 신뢰할 수있는 참고 자료를 제공 할 수 있습니까?
폐쇄 란 무엇입니까? Java 7에 포함되어야합니다. (클로저는 Java 7에 포함되도록 논의되었지만 결국에는 포함되지 않았습니다. -ed) 클로저에 대해 배울 수있는 신뢰할 수있는 참고 자료를 제공 할 수 있습니까?
답변:
다음은 Java에서 클로저를 도입 한 개척자 중 하나 인 Neal Gafter의 블로그 입니다. 2007 년 1 월 28 일 폐쇄에 대한 그의 게시물은 A Definition of Closures로 명명되었습니다 . 그의 블로그에는 비디오뿐만 아니라 시작하는 데 도움이되는 많은 정보가 있습니다. 여기에 훌륭한 Google 토크가 있습니다 . 프로그래밍 언어의 고급 주제 -Neal Gafter와 함께 Java 를위한 클로저 도 있습니다.
클로저는 둘러싸는 범위의 변수에 액세스하여 참조 (및 전달) 할 수있는 코드 블록입니다.
Java 1.1 이후로 익명의 내부 클래스는이 기능을 매우 장황한 방식으로 제공했습니다. 또한 final
지역 변수 만 사용할 수 있다는 (그리고 확실히 할당 된) 제한이 있습니다. (비 final
지역 변수도 범위 내에 있지만 사용할 수 없습니다.)
Java SE 8은 "lambdas"라고하는 단일 메소드 인터페이스 *에 대해보다 간결한 버전을 갖도록 고안되었습니다. Lambda에는 익명 내부 클래스와 거의 동일한 제한이 있지만 일부 세부 정보는 무작위로 다릅니다.
Lambda 는 Project Lambda 및 JSR 335 하에서 개발되고 있습니다.
* 원래 설계는 SAM (Single Abstract Methods) 유형을 허용하는 더 유연했습니다. 불행히도 새로운 디자인은 덜 유연하지만 인터페이스 내에서 구현을 허용하는 것을 정당화하려고합니다.
Tom Hawtin 에 따르면
클로저는 둘러싸는 범위의 변수에 액세스하여 참조 (및 전달) 할 수있는 코드 블록입니다.
이제 나는 유용하기를 바라면서 자바 로의 " straigth "번역 과 함께 Wikipedia 의 JavaScript 클로저 예제를 에뮬레이트하려고 합니다.
//ECMAScript
var f, g;
function foo() {
var x = 0;
f = function() { return ++x; };
g = function() { return --x; };
x = 1;
print('inside foo, call to f(): ' + f()); // "2"
}
foo();
print('call to g(): ' + g()); // "1"
print('call to f(): ' + f()); // "2"
이제 Java 부분 : Function1은 arity 1 (하나의 인수)이있는 "Functor"인터페이스입니다. Closure는 함수 역할을하는 구체적인 Functor 인 Function1을 구현하는 클래스입니다 (int-> int). main () 메서드에서 JavaScript 예제의 호출을 복제하여 foo를 Closure 객체로 인스턴스화합니다. IntBox 클래스는 단순한 컨테이너이며 1 int의 배열처럼 작동합니다.
정수 a [1] = {0}
interface Function1 {
public final IntBag value = new IntBag();
public int apply();
}
class Closure implements Function1 {
private IntBag x = value;
Function1 f;
Function1 g;
@Override
public int apply() {
// print('inside foo, call to f(): ' + f()); // "2"
// inside apply, call to f.apply()
System.out.println("inside foo, call to f.apply(): " + f.apply());
return 0;
}
public Closure() {
f = new Function1() {
@Override
public int apply() {
x.add(1);
return x.get();
}
};
g = new Function1() {
@Override
public int apply() {
x.add(-1);
return x.get();
}
};
// x = 1;
x.set(1);
}
}
public class ClosureTest {
public static void main(String[] args) {
// foo()
Closure foo = new Closure();
foo.apply();
// print('call to g(): ' + g()); // "1"
System.out.println("call to foo.g.apply(): " + foo.g.apply());
// print('call to f(): ' + f()); // "2"
System.out.println("call to foo.f.apply(): " + foo.f.apply());
}
}
다음을 인쇄합니다.
inside foo, call to f.apply(): 2
call to foo.g.apply(): 1
call to foo.f.apply(): 2
클로저에 대한 정의는 이 위키 페이지 를 참조하십시오 .
그리고이 페이지는 Java 8로 마감되었습니다. http://mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html
이 Q & A : Closures in Java 7도 참조하십시오.
Java Closures는 J2SE 8의 일부가 될 예정이며 2012 년 말에 출시 될 예정입니다.
Java 8의 클로저 지원에는 Lambda 표현식, 메서드 참조, 생성자 참조 및 기본 메서드의 개념이 포함됩니다.
이에 대한 자세한 정보와 작업 예제는 http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html을 방문하십시오.
예, Closure (Lambda Expressions)는 곧 출시 될 Java SE 8 릴리스의 새로운 기능입니다. 아래 링크에서 이에 대한 자세한 정보를 얻을 수 있습니다. http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
Java 5, 6 및 7에 대한 클로저 구현
http://mseifed.blogspot.se/2012/09/bringing-closures-to-java-5-6-and-7.html
그것은 하나가 요청할 수있는 모든 것을 포함합니다 ...