문제

내부 블록은 외부 블록의 이름과 동일한 이름의 변수를 선언하기 때문에 다음 방법이 작동하지 않습니다. 분명히 변수는 선언 된 블록이 아니라 선언 된 메소드 또는 클래스에 속하므로 외부 스코프의 변수를 밀어내는 디버깅에 대한 짧은 작은 임시 블록을 쓸 수 없습니다. 잠시만 그림자 :

void methodName() {
  int i = 7;
  for (int j = 0; j < 10; j++) {
    int i = j * 2;
  }
}

내가 사용한 거의 모든 블록 스코프 언어는 학교에서 통역사와 컴파일러를 쓴 사소한 작은 언어를 포함하여 이것을 지원했습니다. Perl은 CAN Scheme과 마찬가지로이 작업을 수행 할 수 있으며 심지어 C. 심지어 PL/SQL조차도이를 지원합니다!

Java에 대한이 디자인 결정의 근거는 무엇입니까?

편집 : 누군가가 지적했듯이 Java는 블록 점점을 가지고 있습니다. 내가 묻는 개념의 이름은 무엇입니까? 언어 디자인 수업에서 더 많이 기억할 수 있기를 바랍니다. :)

도움이 되었습니까?

해결책

나는 이론적 근거가 대부분 의도적이지 않고 프로그래밍 또는 논리 결함이라고 생각합니다.

당신의 것만 큼 사소한 예에서는 분명하지만, 큰 코드 블록에서 실수로 변수를 다시 선언하는 것은 분명하지 않을 수 있습니다.

ETA : Java의 예외 처리와 관련이있을 수도 있습니다. 나는이 질문의 일부가 시도 섹션에서 선언 된 변수가 캐치/마침내 범위에서 사용할 수없는 이유와 관련된 질문에서 논의되었다고 생각했다.

다른 팁

글쎄, 엄밀히 말하면, Java 하다 블록 스코핑 변수 선언이 있습니다. 그래서 이것은 오류입니다.

void methodName() {
  for (int j = 0; j < 10; j++) {
    int i = j * 2;
  }
  System.out.println(i); // error
}

'I'가 For Block 외부에 존재하지 않기 때문입니다.

문제는 Java가 동일한 방법의 외부 블록에서 선언 된 다른 변수의 동일한 이름을 가진 변수를 만들 수 없다는 것입니다. 다른 사람들이 말했듯이, 이것은 아마도 식별하기 어려운 버그를 막기 위해 이루어 졌을 것입니다.

작가가 의도적으로 수행하는 것은 드문 일이 아니기 때문에 이제 동일한 이름을 가진 두 개의 변수가 있다는 것을 잊어 버려서 완전히 망쳐 놓습니다. 내부 변수 이름을 변경하지만 변수를 사용하는 코드를 남기고 이제는 이전에 표시된 변수를 본질적으로 사용합니다. 이로 인해 여전히 컴파일되지만 휘발성이 실행되는 프로그램이 생깁니다.

마찬가지로, 실수로 변수를 섀도우 변수로 만들고 프로그램의 동작을 변경하는 것은 드문 일이 아닙니다. 무의식적으로 기존 변수를 섀도 킹하면 위에서 언급했듯이 변수가 쉽게 변경되지 않을 수 있습니다.

이 그림자를 허용하여 너무 위험한 것으로 배제하는 데는 이점이 거의 없습니다. 진지하게, 새로운 변수에 다른 것을 부르면 문제가 사라집니다.

그것은 발견하기 어려운 버그로 이어집니다. C#에서 비슷합니다.

Pascal은 기능 본문 위의 변수를 선언해야하므로이를 지원하지 않습니다.

이 질문에서 근본적인 가정은 잘못되었습니다.

자바 하다 블록 레벨 범위가 있습니다. 그러나 그것은 또한 범위의 계층 구조를 가지고 있기 때문에 참조 할 수 있습니다. ifor 루프이지만 그렇지 않습니다 j for 루프 외부.

public void methodName() {
  int i = 7;
  for (int j = 0; j < 10; j++) {
    i = j * 2;
  }

  //this would cause a compilation error!
  j++;
}

나는 내 인생에서 왜 당신이 왜 범위가 다른 방식으로 행동하기를 원하는지 알아낼 수 없습니다. 어느 것을 결정하는 것은 불가능합니다 i 당신은 for 루프 내부를 언급하고 있었고, 나는 당신이 참조하려는 시간의 99.999%입니다. i 방법 내부.

또 다른 이유 : 이런 종류의 변수 선언이 허용 된 경우, 사람들은 외부 블록 변수에 액세스하는 방법을 원할 것입니다. "외부"키워드와 같은 것일 수 있습니다.

void methodName() {
    int i = 7;
    for (int j = 0; j < 10; j++) {
        int i = outer.i * 2;
        if(i > 10) {
            int i = outer.outer.i * 2 + outer.i;
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top