Java 7'de kapatma [kapalı]


105

Kapatma nedir? Java 7'ye dahil edilmesi gerekiyordu. (Kapanışlar Java 7'ye dahil edilmek üzere tartışıldı, ancak sonunda dahil edilmedi. -Ed) Herhangi biri bana kapanışlar hakkında bir şeyler öğrenebileceğim bazı güvenilir referanslar sağlayabilir mi?

Yanıtlar:


59

İşte Neal Gafter'ın blogu , Java'da kapanışları tanıtan öncülerden biri. 28 Ocak 2007 tarihli kapanışlarla ilgili yazısının adı Kapanışların Tanımı adlı blogunda, videoların yanı sıra başlamanıza yardımcı olacak pek çok bilgi var. Burada harika bir Google konuşması - Programlama Dillerinde İleri Konular - Neal Gafter ile Java İçin Kapanışlar da var.


2
Blog genelinden daha spesifik bir bağlantınız var mı?
I82Much


1
Eğer biri benim gibi
aptalsa

Kapatma işlemlerini başlangıçta bunlara sahip olmayan bir dilde uygulamayı hayal edemiyorum .. biraz çılgınca
Alexander Mills

Alexander Mills sadece merak ediyor .. neden?
Bartzilla

84

Kapanış, çevreleyen kapsamın değişkenlerine erişimle başvurulabilen (ve etrafından iletilebilen) bir kod bloğudur.

Java 1.1'den beri, anonim iç sınıf bu olanağı oldukça ayrıntılı bir şekilde sağlamıştır. Ayrıca, yalnızca finalyerel değişkenleri kullanma (ve kesinlikle atama) kısıtlamaları vardır . (Not, finalyerel olmayan değişkenler bile kapsam dahilindedir, ancak kullanılamaz.)

Java SE 8'in "lambdas" adı verilen tek yöntemli arabirimler * için bunun daha kısa bir sürümüne sahip olması amaçlanmıştır. Bazı ayrıntılar rastgele değişse de, Lambdalar anonim iç sınıflarla hemen hemen aynı kısıtlamalara sahiptir.

Lambdalar, Project Lambda ve JSR 335 altında geliştirilmektedir .

* Başlangıçta tasarım, Tek Soyut Yöntemler (SAM) türlerine izin veren daha esnekti. Ne yazık ki yeni tasarım daha az esnektir, ancak arayüzler içinde uygulamaya izin verilmesini haklı çıkarmaya çalışır.


7

Tom Hawtin'e göre

Kapanış, çevreleyen kapsamın değişkenlerine erişimle başvurulabilen (ve etrafından iletilebilen) bir kod bloğudur.

Şimdi Wikipedia'daki JavaScript kapatma örneğini, yararlı olması umuduyla Java'ya " düz " bir çeviriyle taklit etmeye çalışıyorum :

//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"

Şimdi java kısmı: Function1, arity 1 (bir argüman) ile "Functor" arayüzüdür. Closure, işlev olarak hareket eden somut bir Functor olan Function1'i uygulayan sınıftır (int -> int). Main () yönteminde, foo'yu bir Closure nesnesi olarak somutlaştırıyorum, JavaScript örneğindeki çağrıları kopyalıyorum. IntBox sınıfı yalnızca basit bir kapsayıcıdır, 1 int dizisi gibi davranır:

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());

    }
}

Aşağıdakileri yazdırır:

inside foo, call to f.apply(): 2
call to foo.g.apply(): 1
call to foo.f.apply(): 2 

2
IMO adının yanı sıra bunun kapanışlarla ilgisi yok
n00b


4

Java Closures, J2SE 8'in bir parçası olacak ve 2012'nin sonunda piyasaya sürülecek.

Java 8'in kapanış desteği, Lambda İfadeleri, Yöntem Referansı, Yapıcı Referansı ve Varsayılan Yöntemler konseptini içerir.

Bununla ilgili daha fazla bilgi ve çalışma örnekleri için lütfen şu adresi ziyaret edin: http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html


1
Hmm, ancak Java 8 kapanış değişkeninin değiştirilmesine izin vermiyor. İyi makale.
nawfal


0

Java 5, 6 ve 7 için bir kapatma uygulaması

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

Birinin isteyebileceği her şeyi içerir ...


Bağlantı, onu açıklayan bir metne gidiyor, ancak o sayfadan bağlantılı kod mevcut değil. Uygulama nerede?
Jerry Jeremiah

@JerryJeremiah İşte burada, şimdi farklı bir adı var, ayrıca orijinal olarak mevcut olan tüm sürümler orada değil (son olmayan erişimi ve soyut sınıflar aracılığıyla daha fazlasını desteklemek için, <Java 8 sürümleri için tekrar eklenebilir, hangi platformsunuz? arıyorsunuz?): bitbucket.org/momomo/opensource/src
mmm

2
Bağlantılar kopuyor!
sunleo

404 aldım bağlantı
Alexander Mills

bağlantı bozuk (bu yüzden bağlantıları cevap olarak
koymamalıyız
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.