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?

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.


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.


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 

2
IMO selain nama ini tidak ada hubungannya dengan penutupan
n00b




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 ...


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.