Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

การใช้ Diamond Operator กับ Anonymous Classes ใน Java 9

Diamond operator ถูกนำเข้ามาใน Java 7 เพื่อทำให้โค้ดอ่านง่ายขึ้น แต่ไม่สามารถใช้กับ anonymous inner classes ได้ ใน Java 9 diamond operator สามารถใช้กับ anonymous inner class ได้ เพื่อปรับปรุงความอ่านง่ายของโค้ด

ตัวอย่างโค้ด


public class DiamondOperatorTest {
    public static void main(String args[]) {
        Handler<Integer> intHandler = new Handler<>(1) {
            @Override
            public void handle() {
                System.out.println(data);
            }
        };
        intHandler.handle();
        
        Handler<? extends Number> intHandler1 = new Handler<>(2) {
            @Override
            public void handle() {
                System.out.println(data);
            }
        };
        intHandler1.handle();
        
        Handler<?> handler = new Handler<>("test") {
            @Override
            public void handle() {
                System.out.println(data);
            }
        };
        handler.handle();
    }
}

abstract class Handler<T> {
    public T data;
    public Handler(T data) {
        this.data = data;
    }
    abstract void handle();
}

ผลลัพธ์


1
2
test

คำอธิบาย

  • new Handler<>(1) - Diamond operator ระบุ type arguments จาก context (Handler<Integer>)
  • new Handler<>(2) - ใช้กับ bounded wildcard ? extends Number
  • new Handler<>("test") - ใช้กับ unbounded wildcard ?>
  • ก่อน Java 9 ต้องเขียน new Handler<Integer>(1) ซ้ำ

ข้อจำกัด

  • ทำงานได้เฉพาะเมื่อ compiler สามารถ infer type ได้จาก context
  • Anonymous class ต้องมี constructor parameters ที่ชี้ชัดเจน type
  • ไม่ทำงานกับ generic methods ที่ type inference ล้มเหลว

เปรียบเทียบ Before/After Java 9

Scenario Java 7/8 Java 9+
Anonymous class with explicit type new Handler<Integer>(1) { ... } new Handler<>(1) { ... }
Anonymous class with wildcard new Handler<? extends Number>(2) { ... } new Handler<>(2) { ... }
Anonymous class with unbounded wildcard new Handler<?>("test") { ... } new Handler<>("test") { ... }
Regular class instantiation new HashMap<String, Integer>() new HashMap<>() (Java 7+)

ประโยชน์

    <ลด boilerplate code
  • ลดโอกาส type mismatch errors
  • โค้ดสะอาดขึ้น อ่านง่ายขึ้น
  • Consistent กับ regular class instantiation