การปิดใน Java 7 [ปิด]


105

การปิดคืออะไร? มันควรจะรวมอยู่ใน Java 7 (มีการพูดถึงการปิดเพื่อรวมไว้ใน Java 7 แต่ในท้ายที่สุดก็ไม่รวม -ed)ใครช่วยให้ข้อมูลอ้างอิงที่เชื่อถือได้จากที่ที่ฉันสามารถเรียนรู้เกี่ยวกับการปิดได้บ้าง?

คำตอบ:


59

นี่คือบล็อกของ Neal Gafterหนึ่งในผู้บุกเบิกที่แนะนำการปิดใน Java โพสต์ของเขาเมื่อปิดตั้งแต่วันที่ 28 มกราคม 2550 มีชื่อว่าA Definition of Closuresในบล็อกของเขามีข้อมูลมากมายที่จะช่วยให้คุณเริ่มต้นได้เช่นเดียวกับวิดีโอ นี่คือการพูดคุยของ Google ที่ยอดเยี่ยม - หัวข้อขั้นสูงในภาษาการเขียนโปรแกรม - การปิดสำหรับ Javaด้วย Neal Gafter เช่นกัน


2
คุณมีลิงก์ที่เฉพาะเจาะจงมากกว่าบล็อกโดยรวมหรือไม่?
I82 มาก


1
ถ้าใครโง่เหมือนฉันและถ้าคุณเอาหัวโขกกำแพงเพื่อให้รู้ว่าการปิดนี้คืออะไร .... ไปเลย .. youtube.com/watch?v=Nj3_DMUXEbE
Piyush Kukadiya

ฉันนึกไม่ออกว่าจะใช้การปิดในภาษาที่ไม่มีในตอนแรก .. บ้าไปแล้ว
Alexander Mills

Alexander Mills แค่อยากรู้ .. ทำไม?
Bartzilla

84

การปิดคือบล็อกของรหัสที่สามารถอ้างอิงได้ (และส่งต่อไปรอบ ๆ ) โดยมีการเข้าถึงตัวแปรของขอบเขตการปิดล้อม

ตั้งแต่ Java 1.1 คลาสภายในที่ไม่ระบุชื่อได้จัดเตรียมสิ่งอำนวยความสะดวกนี้ในลักษณะที่ละเอียดมาก นอกจากนี้ยังมีข้อ จำกัด ในการใช้final(และกำหนดแน่นอน) ตัวแปรท้องถิ่น (หมายเหตุแม้finalตัวแปรที่ไม่ใช่โลคัลจะอยู่ในขอบเขต แต่ก็ไม่สามารถใช้ได้)

Java SE 8 มีวัตถุประสงค์เพื่อให้มีเวอร์ชันที่กระชับยิ่งขึ้นสำหรับอินเทอร์เฟซวิธีเดียว * ที่เรียกว่า "lambdas" Lambdas มีข้อ จำกัด เหมือนกับคลาสภายในที่ไม่ระบุชื่อแม้ว่ารายละเอียดบางอย่างจะแตกต่างกันไปแบบสุ่ม

lambdas ที่ถูกพัฒนาขึ้นภายใต้โครงการแลมบ์ดาและJSR 335

* เดิมทีการออกแบบมีความยืดหยุ่นมากกว่าโดยอนุญาตให้ใช้ประเภท Single Abstract Methods (SAM) น่าเสียดายที่การออกแบบใหม่มีความยืดหยุ่นน้อยกว่า แต่พยายามที่จะพิสูจน์ว่าอนุญาตให้ใช้งานภายในอินเทอร์เฟซได้


7

อ้างอิงจากTom Hawtin

การปิดคือบล็อกของรหัสที่สามารถอ้างอิงได้ (และส่งต่อไปรอบ ๆ ) โดยมีการเข้าถึงตัวแปรของขอบเขตการปิดล้อม

ตอนนี้ฉันกำลังพยายามเลียนแบบตัวอย่างการปิด JavaScript ในWikipediaด้วยการแปล " straigth " เป็น Java โดยหวังว่าจะเป็นประโยชน์:

//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 คืออินเทอร์เฟซ "Functor" ที่มี arity 1 (อาร์กิวเมนต์เดียว) Closure คือคลาสที่ใช้ Function1 ซึ่งเป็น Functor คอนกรีตที่ทำหน้าที่เป็นฟังก์ชัน (int -> int) ในเมธอด main () ฉันเพิ่งสร้างอินสแตนซ์ foo เป็นวัตถุปิดโดยจำลองการโทรจากตัวอย่าง JavaScript คลาส IntBox เป็นเพียงคอนเทนเนอร์ธรรมดามันทำงานเหมือนอาร์เรย์ 1 int:

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 และมีกำหนดเปิดตัวภายในสิ้นปี 2555

การสนับสนุนการปิดของ Java 8 รวมถึงแนวคิดของ Lambda Expressions, Method Reference, Constructor Reference และ Default Methods

ดูข้อมูลเพิ่มเติมและตัวอย่างการทำงานได้ที่: http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html


1
อย่างไรก็ตาม Java 8 ไม่อนุญาตให้แก้ไขตัวแปรการปิด บทความที่ดี
nawfal

3

ใช่ Closure (Lambda Expressions) เป็นคุณลักษณะใหม่ที่มาพร้อมกับ Java SE 8 ที่กำลังจะเปิดตัว คุณสามารถรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ได้จากลิงค์ด้านล่าง: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html


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 ลิงก์ตายแล้ว
Alexander Mills

ลิงค์เสีย (นี่คือเหตุผลที่เราไม่ควรใส่ลิงค์เป็นคำตอบ ... )
OhadR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.