선언이 아닌 경우 배열 초기화 구문


141

난 쓸수있다:

AClass[] array = {object1, object2}

나는 또한 쓸 수 있습니다 :

AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;

그러나 나는 쓸 수 없다 :

AClass[] array;
...
array = {object1, object2};

Java로 차단되는 이유는 무엇입니까?

나는 그 문제를 해결하는 방법을 알고 있지만 때때로 더 간단합니다.

예를 들면 다음과 같습니다.

public void selectedPointsToMove(cpVect coord) {

    if (tab == null) {
        if (arePointsClose(coord, point1, 10)) {
            cpVect[] tempTab = {point1};
            tab = tempTab;
        } else if (arePointsClose(point2, coord, 10)) {
            cpVect[] tempTab = {point2};
            tab = tempTab;
        } else {
            cpVect[] tempTab = {point1,point2};
            tab = tempTab;
        }
    }
}

Java에서 배열로 재생하는 방법을 배운 이래로 간단한 버그가 발생했습니다.


텍스트 형식에 대해 죄송하지만 중국에서 어떤 이유로 텍스트 레이아웃 단추가 나타나지 않습니다 : S
Jason Rogers

코드의 경우 4 칸 이상 들여 쓰기하십시오.
Mat

다른 문제는 붙여 넣은 코드에 TAB 문자가 있다는 것입니다. 서식이 엉망이됩니다.
Stephen C

고마워, 이클립스는 들여 쓰기에 탭을 사용하므로 붙여 넣을 때 물건을 엉망으로 만듭니다. 편집 해 주셔서 감사합니다
Jason Rogers

들여 쓰기에 TAB 문자를 사용하지 않도록 Eclipse를 재구성 할 수 있으며 재구성 해야 합니다. 변명으로 사용하지 마십시오.
Stephen C

답변:


137

Java로 차단되는 이유는 무엇입니까?

Java 디자이너에게 문의해야합니다. 제한에 대한 미묘한 문법적 이유가있을 수 있습니다. 배열 생성 / 초기화 구성 중 일부는 Java 1.0에없고 (IIRC)는 Java 1.1에 추가되었습니다.

그러나 "왜"는 중요하지 않습니다 ... 제한이 있으며, 그와 함께 살아야합니다.

나는 그 문제를 해결하는 방법을 알고 있지만 때때로 더 간단합니다.

당신은 이것을 쓸 수 있습니다 :

AClass[] array;
...
array = new AClass[]{object1, object2};

9
새로운 선언이 없으면 명령문 블록과 배열 이니셜 라이저간에 차이가 없을 것입니다 (자바 스크립트에서와 같이 오도 할 수 있음}
bestsss

10
그것은 것입니다 혼란 ... 그리고 분석하기 어려운 일. {o1()}유효한 표현식이고 {o1();}유효한 명령문 블록 인지 고려하십시오 . 파서는 '}'또는 ';'에 도착해야합니다. 두 경우를 구별하기 전에 문법 문제는 전혀 미묘하지 않습니다 !!
Stephen C

19

이유 질문에 대답하려고합니다 .Java 배열은 ArrayList와 같은 클래스에 비해 매우 간단하고 초보적입니다. Java는 선언시 배열에 할당해야 할 메모리 양을 알고 싶어합니다. ArrayList는 훨씬 더 동적이며 시간에 따라 크기가 달라질 수 있습니다.

배열을 2의 길이로 초기화하고 나중에 3의 길이가 필요하다는 것을 알게되면 가지고있는 것을 버리고 완전히 새로운 배열을 만들어야합니다. 따라서 '새'키워드.

처음 두 예제에서는 선언 할 때 할당 할 메모리 양을 알려줍니다. 세 번째 예에서 배열 이름은 전혀 포인터가 아니므로 초기화 될 때 적절한 양의 메모리를 할당하기 위해 새 배열을 명시 적으로 만들어야합니다.

나는 첫 번째 예를 말한다 (그리고 누군가가 더 잘 알고 있다면 나를 교정하십시오)

AClass[] array = {object1, object2}

실제로 의미

AClass[] array = new AClass[]{object1, object2};

그러나 Java 디자이너가 한 것은 선언시 배열을 만들면 더 빨리 작성하는 것입니다.

제안 된 해결 방법이 좋습니다. 런타임시 시간 또는 메모리 사용량이 중요한 경우 배열을 사용하십시오. 중요하지 않고 이해하고 작업하기 쉬운 코드를 원할 경우 ArrayList를 사용하십시오.


2
Quoting Oracle : "또는 바로 가기 구문을 사용하여 배열을 만들고 초기화 할 수 있습니다 . " 어쩌면 어떤 시점에서 new를 사용하여 배열에 메모리 공간이 있어야하기 때문일 수 있습니다 . 바로 가기에는 새로운 기능이 있지만 바로 가기는 선언에서만 유효합니다. 다른 곳에서는 단축키가 허용되지 않으며 new는 필수입니다.

3
죄송합니다. "이유"질문에 답변하려는 시도에는 물이 포함되지 않습니다. 컴파일러 는 허용되는 이니셜 라이저 양식에서와 같이 {}... 사이의 표현식을 계산하여 배열의 크기를 계산할 수 있습니다.
Stephen C

8

이유 부분에 대답 할 수 없습니다.

그러나 역동적 인 것을 원한다면 Collection ArrayList를 고려하지 마십시오.

ArrrayList는 모든 Object 유형이 될 수 있습니다.

그리고 강제로 배열로 원한다면 toArray () 메소드를 사용할 수 있습니다.

예를 들면 다음과 같습니다.

            ArrayList<String> al = new ArrayList<String>();
            al.add("one");
            al.add("two");
            String[] strArray = (String[]) al.toArray(new String[0]);

이것이 도움이되기를 바랍니다.


2
Array의 반환 형식을 String []으로 캐스팅 할 필요가 없습니다. 계약에 따라 반환 된 배열은 지정된 배열과 동일한 유형입니다. docs.oracle.com/javase/6/docs/api/java/util/…
Ankur Agarwal

4

이 괴물 같은 new AClass[] { ... }구문 을 좋아하지 않는 사람들에게는 설탕이 있습니다.

public AClass[] c(AClass... arr) { return arr; }

이 작은 기능을 원하는대로 사용하십시오.

AClass[] array;
...
array = c(object1, object2);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.