자바 7의 폐쇄 [종료]


105

폐쇄 란 무엇입니까? Java 7에 포함되어야합니다. (클로저는 Java 7에 포함되도록 논의되었지만 결국에는 포함되지 않았습니다. -ed) 클로저에 대해 배울 수있는 신뢰할 수있는 참고 자료를 제공 할 수 있습니까?

답변:


59

다음은 Java에서 클로저를 도입 한 개척자 중 하나 인 Neal Gafter의 블로그 입니다. 2007 년 1 월 28 일 폐쇄에 대한 그의 게시물은 A Definition of Closures로 명명되었습니다 . 그의 블로그에는 비디오뿐만 아니라 시작하는 데 도움이되는 많은 정보가 있습니다. 여기에 훌륭한 Google 토크가 있습니다 . 프로그래밍 언어의 고급 주제 -Neal Gafter와 함께 Java 를위한 클로저 도 있습니다.


2
전체 블로그보다 더 구체적인 링크가 있습니까?
— I82Much


1
누군가 나처럼 멍청하고 벽에 대고 머리를 치고 있다면이 클로저가 뭔지 알기 위해 .... 그런 다음 .. youtube.com/watch?v=Nj3_DMUXEbE
— Piyush Kukadiya

내가 didnt 한 처음에 them..kinda 미친 가지고 언어로 클로저를 구현 상상하지 못할
— 알렉산더 밀스

알렉산더 밀스는 궁금해 .. 왜?
— Bartzilla

84

클로저는 둘러싸는 범위의 변수에 액세스하여 참조 (및 전달) 할 수있는 코드 블록입니다.

Java 1.1 이후로 익명의 내부 클래스는이 기능을 매우 장황한 방식으로 제공했습니다. 또한 final지역 변수 만 사용할 수 있다는 (그리고 확실히 할당 된) 제한이 있습니다. (비 final지역 변수도 범위 내에 있지만 사용할 수 없습니다.)

Java SE 8은 "lambdas"라고하는 단일 메소드 인터페이스 *에 대해보다 간결한 버전을 갖도록 고안되었습니다. Lambda에는 익명 내부 클래스와 거의 동일한 제한이 있지만 일부 세부 정보는 무작위로 다릅니다.

Lambda 는 Project Lambda 및 JSR 335 하에서 개발되고 있습니다.

* 원래 설계는 SAM (Single Abstract Methods) 유형을 허용하는 더 유연했습니다. 불행히도 새로운 디자인은 덜 유연하지만 인터페이스 내에서 구현을 허용하는 것을 정당화하려고합니다.


7

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 

2
이름 외에 IMO는 폐쇄와 관련이 없습니다
— n00b


4

Java Closures는 J2SE 8의 일부가 될 예정이며 2012 년 말에 출시 될 예정입니다.

Java 8의 클로저 지원에는 Lambda 표현식, 메서드 참조, 생성자 참조 및 기본 메서드의 개념이 포함됩니다.

이에 대한 자세한 정보와 작업 예제는 http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html을 방문하십시오.


1
흠, 그러나 Java 8은 클로저 변수의 수정을 허용하지 않습니다. 좋은 기사.
— nawfal


0

Java 5, 6 및 7에 대한 클로저 구현

http://mseifed.blogspot.se/2012/09/bringing-closures-to-java-5-6-and-7.html

그것은 하나가 요청할 수있는 모든 것을 포함합니다 ...


링크는이를 설명하는 텍스트로 이동하지만 해당 페이지에서 링크 된 코드가 존재하지 않습니다. 구현은 어디에 있습니까?
— Jerry Jeremiah

@JerryJeremiah 여기에 이름이 다르지만 원래 존재하는 모든 버전이 존재하지 않습니다 (비 최종 액세스 및 추상 클래스를 통해 더 많은 것을 지원하기 위해 <Java 8 버전에 대해 다시 추가 될 수 있습니다. 어떤 플랫폼입니까? 찾고 계십니까?) : bitbucket.org/momomo/opensource/src
— mmm

2
링크가 깨졌습니다!
— sunleo

내가 링크가 죽었다는 404을 가지고
— 알렉산더 밀스

링크가 끊어졌습니다 (이것이 우리가 답변으로 링크를 넣어서는 안되는 이유입니다 ...)
— OhadR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.