두 가지 방법으로 중괄호를 사용하는 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
해당 중괄호 내에 만 존재하며 그 밖의 범위는 없습니다.
이것이 생성 된 코드 인 경우 코드 생성기가이 작업을 수행하므로 a를 몇 번 삽입했는지에 대해 걱정할 필요 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");
}
};
일부 단위 테스트 프레임 워크는이 구문을 다른 수준으로 끌어 올려 완전히 컴파일 할 수없는 멋진 일을 허용합니다. 낯설어 보이기 때문에 나도 그렇게 큰 팬은 아니지만,이 사용을 통해 어떤 일이 벌어지고 있는지 적어도 인식하는 것은 가치가 있습니다.
답변
범위 제한 답변에 동의하지만 한 가지 추가하겠습니다.
때로는 코드 섹션을 접는 것을 좋아하고 자동으로 중괄호를 접는 편집기가있는 사람들의 코드에서 이와 같은 구조를 볼 수 있습니다. 그들은 일반적으로 접히는 함수, 클래스, 루프 등에 속하지 않는 논리 섹션에서 코드를 접는 데 사용합니다.
답변
누군가가 else 문을 잊었다 고 생각합니다.
추가 블록 범위를 만드는 데 신경을 쓸 이유가 거의 없습니다. 이 경우와 대부분의 경우, 누군가 영리한 일을하고있는 것보다 제어문을 입력하는 것을 잊었을 가능성이 훨씬 더 높습니다.
답변
그들은 내부 범위를 만듭니다. 이 중괄호 안에 선언 된 변수는 그 밖에 보이지 않습니다. 이것은 C / C ++에도 적용됩니다.
답변
중괄호는 switch / case 문의 범위를 줄이는데도 유용합니다.
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
}
}