2012-01-06 6 views
16

Tôi đã đến Java từ Visual Basic, và dường như nghĩ rằng tôi có được, bằng nhiều cách, tha hồ: pInline đối tượng instantiation và chuyển đổi trong Java

Có cách nào để tạo một đối tượng và sửa đổi nó inline ? Một cái gì đó như:

JFrame aFrame = new JFrame(); 
aFrame.add(new JPanel() {.setSize(100,100) .setLocation(50,50) .setBackground(Color.red) }); 

Tôi đã có thể @Override phương pháp, nhưng tôi đang tìm kiếm một cái gì đó đơn giản hơn. Tôi đã tìm kiếm rất nhiều, nhưng nếu có một thuật ngữ cụ thể cho loại instantiation nội tuyến, nó eludes tôi.

Cảm ơn bạn đã dành thời gian!

Trả lời

26

Có nhưng một số người coi nó là hacky.

JFrame aFrame = new JFrame(); 
aFrame.add(new JPanel() {{ 
setSize(100,100); 
setLocation(50,50); 
setBackground(Color.red); 
}}); 

Về cơ bản bạn thêm một lớp {} (khối khởi tạo mẫu), được thực thi khi bảng điều khiển được khởi tạo. do đó bạn có thể đặt bất kỳ mã nào trong đó. (như gọi điện thoại cho người định cư).

+1

Kỹ thuật này được gọi là gì? Tôi muốn hiểu hơn về nó. – SJuan76

+3

@ SJuan76 được gọi là "lớp ẩn danh với trình khởi tạo" – alf

+0

Ông đang sử dụng khối khởi tạo mẫu trong lớp ẩn danh và gọi đó là các phương thức kế thừa như this.setSize ... –

8

Một mẹo hay được trình bày trong câu trả lời của @ ClickerMonkey. Tuy nhiên, nếu một lớp hỗ trợ phương pháp chaining, bạn có thể sử dụng cú pháp tương tự mà không initializer "hack":

new ChainClass().setSize(100,100) .setLocation(50,50) .setBackground(Color.red) 

Nhược điểm là các ChainClass phải nhìn tương tự như sau:

public class ChainClass { 
    public ChainClass setSize(int w, int h) { 
    // ... 
    return this; 
    } 

    public ChainClass setLocation(int x, int y) { 
    // ... 
    return this; 
    } 

    // etc. 
} 

Đây là , thật đáng buồn, không phải là trường hợp đối với hầu hết các lớp Java chuẩn. Bạn có thể thực hiện nó cho các lớp học của bạn mặc dù.

+4

Đây được gọi là giao diện Thông thạo. jQuery sử dụng kỹ thuật này. – ComethTheNerd

+1

Điều đó, ngay tại đó, là lý do tại sao tôi muốn có kiểu trả về "này" trong java. – Kent

+0

Đặc biệt là vì các lớp chung ... phương pháp chuỗi là gây phiền nhiễu với generics khi bạn có lớp con. – ClickerMonkey