2013-09-02 49 views
14

ví dụ:"new Foo() {}" và "new Foo()" trong Java

Object o1 = new ArrayList<String>(); 
Object o2 = new ArrayList<String>(){}; 
Object o3 = new ArrayList<String>(){{}}; 

có gì khác biệt?

Tôi không thể google ra khỏi ngữ pháp thứ 2/thứ 3 của java, bất kỳ tham chiếu nào?

+2

bản sao có thể có của [Phỏng vấn: Chúng tôi có thể khởi tạo lớp trừu tượng không?] (Http://stackoverflow.com/questions/13670991/interview-can-we-instantiate-abstract-class) –

+0

Thứ ba là khai báo khối khởi tạo đối tượng của lớp ẩn danh. –

+1

Re: thứ ba, http://www.c2.com/cgi/wiki?DoubleBraceInitialization –

Trả lời

25

Đầu tiên tạo một ArrayList

Thứ hai tạo ra một lớp con nặc danh của ArrayList trong đó có một loại generic cụ thể của String

Thứ ba là giống nhau nhưng nó có một khối initializer đó là trống rỗng.

Lưu ý: Nếu có thể, bạn nên viết mã đơn giản nhất và rõ ràng nhất có thể, đặc biệt nếu bạn đang nghĩ về hiệu suất.

+1

+1 đơn giản và ngắn gọn :) – nachokk

+4

Tôi nghĩ bạn nên thêm "trừ khi có một nhận xét chi tiết giải thích rằng có một số nhu cầu đặc biệt kỳ lạ cho một lớp ẩn danh để tránh sự phản chiếu, trường hợp thứ 2 và thứ 3 chỉ đơn giản là ngu ngốc, khó hiểu và sai rồi." – user949300

+1

Tôi sẽ thêm rằng [JMock] (http://www.jmock.org) sử dụng kiểu thứ ba cho nó là mocks để phân lớp và mã hóa kỳ vọng. – ArtB

13
Object o1 = new ArrayList<String>(); 

Tạo một ArrayList.

Object o2 = new ArrayList<String>(){}; 

Ở đây bạn đang tạo một nặc danh lớp kéo dài ArrayList<String> và không ghi đè lên bất cứ điều gì. Vì vậy, sự khác biệt đó là bạn đang subclassing một ArrayList mà không có hành vi overrding, không bao giờ làm điều này nếu bạn không có một lý do chính đáng.

Object o3 = new ArrayList<String>(){{}}; 

Bạn đang tạo giống như 2 nhưng có khối initalizer trống.

+0

cảm ơn! hiểu rồi. có lẽ thứ hai là hữu ích để tránh "loại tẩy xoá"? – marstone

+2

@marstone. Không, đó không phải là việc sử dụng. Loại tẩy xóa không thể tránh được. –

+0

@RohitJain nếu không, làm cách nào để google gson giữ kiểu tham số chung bằng cách sử dụng "TypeToken mới >() {} .getType()"? xin lỗi nếu điều này là tắt chủ đề. – marstone

0

Bạn đang ẩn danh tạo lớp học. Bạn có thể ghi đè lên các phương thức trong trường hợp sau này mà không cần phải định nghĩa một lớp mới trong một tệp riêng.

0

o3 vẫn là phiên bản của phân lớp ẩn danh ArrayList có khối khởi tạo phiên bản trống (bên trong {}).

0
// Instantiate an object of type `ArrayList<String>` 
Object o1 = new ArrayList<String>(); 

// Instantiate an anonymous subclass of `ArrayList<String>` 
Object o2 = new ArrayList<String>(){}; 

// Instantiate an anonymous subclass of `ArrayList<String>` with an empty initializer block 
Object o3 = new ArrayList<String>(){{}}; 
0

Object o2 = new ArrayList<String>(){};
nó là annonymous bên trong lớp kéo dài ArrayList lớp và ghi đè gì cả.
Object o2 = new ArrayList<String>(){{}};
nó cũng là annonymous bên trong lớp kéo dài ArrayList lớp và ghi đè gì, nhưng có một empty instance block.

2
Object o1 = new ArrayList<String>(); 

Tạo một đối tượng ArrayList mới và gán nó vào o1

Object o2 = new ArrayList<String>(){}; 

Tạo một thể hiện mới của một lớp vô danh mà kéo dài ArrayList và gán nó vào o2

Object o3 = new ArrayList<String>(){{}}; 

Tạo mới thể hiện của một lớp ẩn danh (khác với o2) mở rộng ArrayList có trình khởi tạo đối tượng no-op.

Các lớp anon được gán cho o2o3 tương đương nhau nhưng về mặt kỹ thuật chúng sẽ là các lớp khác nhau.

Các vấn đề liên quan