문제

두 가지 방법으로 곱슬 버팀대를 사용하는 Java 코드가 있습니다.

// Curly braces attached to an 'if' statement:
if(node.getId() != null)
{
    node.getId().apply(this);
}

// Curly braces by themselves:
{
    List<PExp> copy = new ArrayList<PExp>(node.getArgs());
    for(PExp e : copy)
    {
        e.apply(this);
    }
}
outAMethodExp(node);

첫 번째 후에 그 독립형 곱슬 괄호는 무엇을합니까? if 진술은 의미가 있습니까?

도움이 되었습니까?

해결책

여분의 버팀대의 유일한 목적은 스코프 제한을 제공하는 것입니다. 그만큼 List<PExp> copy 그 브레이스 안에만 존재하며 그 외부에는 범위가 없습니다.

이것이 코드가 생성되면 코드-제너레이터 가이 작업을 수행한다고 가정하므로 삽입 한 횟수에 대해 걱정할 필요없이 일부 코드 (예 : 이와 같은)를 삽입 할 수 있습니다. List<PExp> copy 이 스 니펫이 동일한 방법에 두 번 이상 삽입되면 변수의 이름을 바꿀 가능성이 높지 않아도됩니다.

다른 팁

나는 Matt B가 쓴 것을 두 번째로, 익명의 교정기에서 본 또 다른 용도가 익명 클래스에서 암시 적 생성자를 선언하는 것이라고 덧붙였다. 예를 들어:

  List<String> names = new ArrayList<String>() {
    // I want to initialize this ArrayList instace in-line,
    // but I can't define a constructor for an anonymous class:
      {
        add("Adam");
        add("Eve");
      }

  };

일부 단위 테스트 프레임 워크는이 구문을 다른 수준으로 끌어 올렸으며, 이는 완전히 작동하지 않는 매끄러운 일을 허용합니다. 그들은 바라보다 익숙하지 않아서 나는 그런 큰 팬이 아니지만,이 용도를 통해 달리면 최소한 무슨 일이 일어나고 있는지 인식하는 것이 가치가 있습니다.

스코프 한계 답변에 동의하지만 한 가지를 추가 할 것입니다.

때로는 코드의 섹션을 접고 버팀대를 자동으로 접을 수있는 편집자가있는 사람들의 코드에서 그런 구조가 보입니다. 그들은 그것을 사용하여 기능, 클래스, 루프 등에 속하지 않는 논리 섹션에서 코드를 접습니다. 일반적으로 접 힙니다.

나는 실제로 누군가가 다른 진술을 잊어 버렸다고 생각합니다.

추가 블록 스코프를 만드는 데 귀찮게할만한 이유는 거의 없습니다. 이 경우 대부분의 경우 누군가가 영리한 일을하고 있다는 것보다 누군가가 통제 진술을 입력하는 것을 잊었을 가능성이 훨씬 높습니다.

그들은 내부 범위를 만듭니다. 이 버팀대 내부에서 선언 된 변수는 그 외부에서 볼 수 없습니다. 이것은 C/C ++에도 적용됩니다.

교정기는 또한 스위치/케이스 문의 범위를 줄이는 데 유용합니다.

switch(foo) {
  case BAR:
     int i = ...
     ...
  case BAZ:
     int i = ... // error, "i" already defined in scope
}

그러나 당신은 쓸 수 있습니다

switch(foo) {
  case BAR:{
     int i = ...
     ...
  }
  case BAZ:{
     int i = ... // OK
  }
}

또한 사용됩니다 초기화 블록.

그들은 새로운 범위를 정의합니다. 즉,이 범위에서 선언 된 모든 것이 곱슬 괄호 밖에서 보이지 않음을 의미합니다.

흥미로운 참고 사항 : 버팀대는 실제로 진술 클래스 : 선언을 가능하게합니다.

이것은 불법입니다 : if(a) int f;

그러나 이것은 합법적입니다 : if(a) { int f; }

나는 그들이 이름이없는 범위를 정의한다고 생각합니다.

범위를 가져오고 복사 외부에는 표시되지 않으므로 나중에 같은 이름으로 다른 변수를 선언 할 수 있습니다. 그리고 그 범위를 종료 한 직후 쓰레기 수집가가 수집 할 수 있습니다. 이 경우 복사 임시 변수 역할을하므로 좋은 예입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top