2010-07-02 2 views

답변

5

그들은 완전히 동일하지 않습니다. 둘 다 이름없는 클래스를 만들지 만 그 유사점은 그 시점에서 끝납니다.

C++에서는 선택적으로 참조로 로컬 변수를 포착하는 클로저를 만듭니다. Java에서는 현재 로컬 변수의 값에 대한 스냅 샷을 얻습니다 (변수는 "최종"이어야합니다).

익명 내부 클래스의 목적은 다른 클래스를 확장하거나 다른 인터페이스를 임시로 구현하는 것입니다. 이러한 이유 때문에 익명의 내부 클래스는 람다 표현식의 작업을 일부 확장 할 수 있습니다 (예 : Runnable 인터페이스 구현). 람다 표현식은 호출되고 환경에서 로컬 변수를 수정할 수 있도록 특별히 설계되었습니다.

+0

범위의 변수에 액세스하는 것을 제외하면 아무런 차이가 없습니다. – yesraaj

+1

@yesraaj, 나는 내면의 수업에 대해 자세히 모른다. 그러나 그 목적이 완전히 다르므로, 나는 우리가 정상적인 방법으로 그들을 비교할 수 없다고 생각합니다. 익명 내부 클래스에서 본문에서 지정하는 내용은 생성 된 이름없는 클래스 본문에 복사됩니다. 따라서 여러 메소드, 클래스 멤버 등을 추가 할 수 있습니다. C++ lambda의 경우 "operator()"의 내용 만 지정하면됩니다. –

+0

+1. 참고로 C#은 항상 모든 로컬 변수를 참조하여 캡처하는 자체 람다를 사용하여 클로저의 문제에 대한 또 다른 접근 방식을 제공합니다. Jon Skeet의 블로그에서 [The Beauty of Closures] (http://csharpindepth.com/Articles/Chapter5/Closures.aspx)의 Java/C#에 관해 읽을 수 있습니다. 이 기사에서는 값 또는 참조로 캡처 할 수있는 C++ 람다를 다루지 않지만 C++의 다른 대부분의 경우와 마찬가지로 캡처 된 참조의 수명을 조심해야합니다. 참조 된 후에 람다를 사용하면 안됩니다 개체가 파괴되었습니다. –

2

C++ 0X 람다 표현식을 익명의 방법, Javas 익명 클래스는 이름이 클래스되어 있습니다. 그래서 그들은 이름을 가지지 않고 공유하지만 개념은 다릅니다.

람다 함수 (may)는 값을 반환하고 익명 클래스는 인스턴스 (개체)를 만드는 데 사용할 수 있습니다.

BTW - wikipedia은 λ함수 인만이 C++ 0x에 제안되었다고 언급합니다.

+0

단어 방식을 사용하는 것은 약간의 실수이다. 람다 식은 익명 메소드가 아니며 익명 함수이다. . –

+0

@snk_kid : C++에서, 그들은 똑같습니다. 클래스 함수는 멤버 메서드입니다. – Puppy

+0

@DeadMG 인스턴스 메소드는 함수와 같지 않습니다. 특히 Smalltalk 및 Objective-C와 같은 언어의 기존/원래 의미에서 함수와 다릅니다. 메소드는 객체 지향 (OO) 용어이고 람다 미적분 또는 함수 프로그래밍 용어는 아니며 Haskell이나 SML과 같은 함수 언어에는 '메소드'가 없습니다. 내가 말했듯이, 방법이라는 단어를 잘못 사용하는 것은 잘못된 것입니다. –

4

Java 익명의 내부 클래스는 둘러싸는 방법으로 final 데이터를 참조 할 수 있으며, 바깥 쪽 클래스에는 모두 데이터 (변경 가능 포함) 데이터를 참조 할 수 있습니다. 따라서 익명 클래스의 메소드는 둘러싼 메소드의 변수 값을 변경할 수 없지만 둘러싼 클래스의 멤버 값을 변경할 수 있습니다.

C++ 람다는 둘러싼 함수에서 모두 데이터 (변경 가능)를 참조 할 수 있으며 멤버 함수 내에 중첩되어 있으면 해당 데이터를 둘러싸는 클래스의 데이터에 대해 동일한 작업을 수행 할 수 있습니다. 둘러싸는 범위 (들)에 대한 정확한 종속성은 프로그래머에 의해 선언되므로 암묵적인 것이 아니라 명시 적입니다.

이것은 매우 비슷하지만 자바 피쳐는 메쏘드 밖에서는 변경할 수 없다는 원칙에 따라, 특히 자연스럽게 스레딩을 전통적으로 사용해온 언어에서 메소드의 지역 변수/매개 변수를 다르게 취급합니다.

제한이없고 모든 종속성이 암시되는 C# lambdas와 비교하십시오. 이것에 의해,이 기능을 가장 적게 표시합니다 (최적 인 형식의 추론을 가지는 것에도 도움이됩니다). 하지만 단점은 스레드에 대한 모든 간단한 규칙을 무효화합니다. 즉, 지역 변수가 "스레드 스택"에 있다는 것은 더 이상 사실이 아니므로 액세스하기 전에 잠글 필요가 없습니다.

+0

Greate answer.자바 람다 함수의 세부 사항 (그리고 어쩌면 구현)을 더 잘 알기 위해 사용할 수있는 특정 리소스가 있습니까? –