Java의 Curly Braces는 그 자체로 무엇을 의미합니까?
-
04-07-2019 - |
문제
두 가지 방법으로 곱슬 버팀대를 사용하는 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; }
나는 그들이 이름이없는 범위를 정의한다고 생각합니다.
범위를 가져오고 복사 외부에는 표시되지 않으므로 나중에 같은 이름으로 다른 변수를 선언 할 수 있습니다. 그리고 그 범위를 종료 한 직후 쓰레기 수집가가 수집 할 수 있습니다. 이 경우 복사 임시 변수 역할을하므로 좋은 예입니다.