2010-06-20 39 views
40
public class Sonnet29 implements Poem { 
    private String[] poem; 
    public Sonnet29() { 
     poem = { "foo", "bar" , "baz"}; 
    } 
    @Override 
    public void recite() { 
     //... 
    } 
} 

Dòng poem = { "foo", "bar" , "baz"}; đang đưa ra lỗi biên dịch.Lỗi trình biên dịch khi sử dụng hằng số mảng trong hàm tạo

Bất kỳ lý do cụ thể nào tại sao điều này không được phép? Làm thế nào để khởi tạo một mảng String với hằng số mảng?

EDIT: Cảm ơn mọi người đã trả lời câu hỏi của bạn. Bây giờ tôi rõ ràng những gì được cho phép và những gì là không. Nhưng tôi có thể yêu cầu bạn lý do tại sao điều này KHÔNG được phép?

String[] pets; 
pets = {"cat", "dog"}; 

Sau khi googling một chút, tôi thấy link này, nơi ở, người ta nói rằng mã hóa như thế này rời khỏi biên dịch trong mơ hồ - cho dù các con vật nuôi nên mảng của Strings hoặc mảng các đối tượng. Tuy nhiên từ tuyên bố, nó có thể rất tốt con số ra rằng nó là một mảng String, phải không ???

+2

Nếu đó là hằng số, thì 'bài thơ' không nên được khởi tạo trong hàm tạo. –

+0

@True Soft: Tôi chỉ đang cố gắng 'khởi tạo' trạng thái đối tượng với một số hằng số. Đồng ý. Nếu bài thơ được khai báo là STATIC, chuỗi tĩnh riêng [] poem = {"foo", "bar", "baz"}; nó hoạt động tốt. – HanuAthena

+0

@HanuAthena, cho dù thành viên có 'tĩnh' hay không, vấn đề ở đây là khởi tạo mảng chỉ được phép trong một khai báo (§8.3, §9.3, §14.4), hoặc như là một phần của việc tạo mảng biểu thức (§15.10). Do đó, không có 'static' nó cũng sẽ làm việc' private string [] poem = {"foo", "bar", "baz"}; 'nếu bạn làm điều này ngay tại chỗ – Andrew

Trả lời

65

này sẽ làm những gì bạn đang tìm kiếm:

danh sách khởi tạo chỉ được phép khi tạo một thể hiện mới của mảng.

17

Từ Java language specification:

Một initializer mảng có thể được quy định trong một tuyên bố, hoặc là một phần của một biểu thức tạo mảng (§15.10), tạo ra một mảng và cung cấp một số giá trị ban đầu

Nói tóm lại, đây là bộ luật:

private int[] values1 = new int[]{1,2,3,4}; 
private int[] values2 = {1,2,3,4}; // short form is allowed only (!) here 

private String[][] map1 = new String[][]{{"1","one"},{"2","two"}}; 
private String[][] map2 = {{"1","one"},{"2","two"}}; // short form 

List<String> list = Arrays.asList(new String[]{"cat","dog","mouse"}); 

và điều này là bất hợp pháp:

private int[] values = new int[4]; 
values = {1,2,3,4}; // not an array initializer -> compile error 

List<String> list = Arrays.asList({"cat","dog","mouse"}); // 'short' form not allowed 
5
{"cat", "dog"} 

Không phải là mảng, nó là bộ khởi tạo mảng.

new String[]{"cat", "dog"} 

Điều này có thể được xem như là một 'hàm tạo' với hai đối số. Biểu mẫu ngắn chỉ có để giảm RSI.

Họ có thể đã đưa ra ý nghĩa thực sự để { "mèo", "con chó"}, vì vậy bạn có thể nói những câu như

{"cat", "dog"}.length 

Nhưng tại sao họ nên làm cho trình biên dịch thậm chí khó khăn hơn để viết, mà không cần thêm bất cứ điều gì hữu ích ? (Câu trả lời ZoogieZork có thể được sử dụng một cách dễ dàng)

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