Penutupan di Java 7 [ditutup]

105

Apa itu closure? Ini seharusnya disertakan dalam Java 7. (Penutupan dibahas untuk dimasukkan di Java 7, tetapi pada akhirnya tidak disertakan. -Ed) Adakah yang bisa memberi saya beberapa referensi yang dapat diandalkan dari mana saya dapat mempelajari hal-hal tentang closure?

Swaranga Sarma
sumber

Jawaban:

59

Berikut adalah blog Neal Gafter salah satu pelopor yang memperkenalkan penutupan di Jawa. Kirimannya tentang penutupan dari 28 Januari 2007 diberi nama Definisi Penutupan. Di blognya, terdapat banyak informasi untuk Anda mulai serta video. Berikut ini adalah pembicaraan Google yang luar biasa - Topik Lanjutan dalam Bahasa Pemrograman - Penutupan Untuk Java dengan Neal Gafter, juga.

Bartzilla
sumber
2
Apakah Anda memiliki tautan yang lebih spesifik daripada keseluruhan blog?
I82Much
1
Jika ada yang bodoh seperti saya dan jika Anda membenturkan kepala Anda ke dinding hanya untuk mengetahui Apa
retasannya
saya tidak bisa membayangkan menerapkan closure dalam bahasa yang awalnya tidak memilikinya.. agak gila
Alexander Mills
Alexander Mills hanya penasaran .. kenapa?
Bartzilla
84

Closure adalah blok kode yang dapat direferensikan (dan diedarkan) dengan akses ke variabel lingkup yang melingkupinya.

Sejak Java 1.1, kelas dalam anonim telah menyediakan fasilitas ini dengan cara yang sangat bertele-tele. Mereka juga memiliki batasan hanya dapat menggunakan final(dan pasti ditugaskan) variabel lokal. (Perhatikan, bahkan finalvariabel non- lokal berada dalam cakupan, tetapi tidak dapat digunakan.)

Java SE 8 dimaksudkan untuk memiliki versi yang lebih ringkas ini untuk antarmuka metode tunggal *, yang disebut "lambda". Lambda memiliki batasan yang hampir sama dengan kelas dalam anonim, meskipun beberapa detail bervariasi secara acak.

Lambda sedang dikembangkan di bawah Proyek Lambda dan JSR 335 .

* Awalnya desainnya lebih fleksibel dengan memungkinkan tipe Single Abstract Methods (SAM). Sayangnya desain baru kurang fleksibel, tetapi berusaha untuk membenarkan implementasi yang diizinkan dalam antarmuka.

Tom Hawtin - tackline
sumber
7

Menurut Tom Hawtin

Closure adalah blok kode yang dapat direferensikan (dan diedarkan) dengan akses ke variabel lingkup yang melingkupinya.

Sekarang saya mencoba untuk meniru contoh penutupan JavaScript di Wikipedia , dengan terjemahan " lurus " ke Java, dengan harapan dapat berguna:

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

Sekarang bagian java: Function1 adalah antarmuka "Functor" dengan arity 1 (satu argumen). Penutupan adalah kelas yang mengimplementasikan Function1, Functor konkret yang bertindak sebagai fungsi (int -> int). Dalam metode main () saya hanya memberi contoh foo sebagai objek Penutupan, mereplikasi panggilan dari contoh JavaScript. Kelas IntBox hanyalah wadah sederhana, ini berperilaku seperti array 1 int:

ke dalam [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());

    }
}

Ini mencetak:

inside foo, call to f.apply(): 2
call to foo.g.apply(): 1
call to foo.f.apply(): 2 
Rob Rosetti
sumber
2
IMO selain nama ini tidak ada hubungannya dengan penutupan
n00b
4

Java Closures akan menjadi bagian dari J2SE 8 dan akan dirilis pada akhir 2012.

Dukungan penutupan Java 8 mencakup konsep Ekspresi Lambda, Referensi Metode, Referensi Pembuat, dan Metode Default.

Untuk informasi lebih lanjut dan contoh kerja untuk ini, silakan kunjungi: http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html

Amit Phaltankar
sumber
1
Hmm, namun Java 8 tidak mengizinkan modifikasi variabel penutupan. Artikel bagus.
nawfal
0

Implementasi penutupan untuk Java 5, 6, dan 7

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

Ini berisi semua yang bisa diminta untuk ...

mmm
sumber
Tautan menuju ke beberapa teks yang menjelaskannya tetapi kode yang ditautkan dari halaman itu tidak ada. Dimana implementasinya?
Jerry Jeremiah
@JerryJeremiah Ini dia, sekarang namanya berbeda, juga semua versi yang aslinya ada tidak ada (untuk mendukung akses non-final dan lebih banyak lagi melalui kelas abstrak, mungkin ditambahkan lagi untuk <versi Java 8, platform apa Anda mencari?): bitbucket.org/momomo/opensource/src
mmm
2
Tautan putus!
sunleo
saya mendapat 404 tautannya mati
Alexander Mills
tautan rusak (inilah mengapa kita tidak boleh menempatkan tautan sebagai jawaban ...)
OhadR