Mam kod Java, który używa nawiasów klamrowych na dwa sposoby
// 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);
Co oznaczają te samodzielne nawiasy klamrowe po pierwszym if
zdaniu?
java
syntax
scope
curly-braces
Paul Wicks
źródło
źródło
copy
można je odrzucić przedoutAMethodExp()
zwrotem. Jeśli jest to połączenie długotrwałe lub wymagające dużej ilości pamięci, może to być pomocne. Umieściłem „korzyść” w cudzysłowie, ponieważ refaktoryzacja na oddzielne metody jest generalnie dużo czystsza i bardziej przejrzysta niż korzystanie z tej składni.Po drugie, co napisał Matt b i dodam, że innym zastosowaniem anonimowych nawiasów klamrowych, jakie widziałem, jest deklarowanie niejawnego konstruktora w klasach anonimowych. Na przykład:
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"); } };
Niektóre frameworki do testowania jednostkowego przeniosły tę składnię na inny poziom, co pozwala na działanie sprytnych rzeczy, które wyglądają na całkowicie niekompilowalne. Ponieważ wyglądają na nieznane, sam nie jestem takim wielkim fanem, ale warto przynajmniej rozpoznać, co się dzieje, jeśli natkniesz się na takie użycie.
źródło
super(...)
.Zgadzam się z odpowiedzią limit zakresu, ale dodałbym jedną rzecz.
Czasami widzisz taką konstrukcję w kodzie ludzi, którzy lubią składać sekcje swojego kodu i mają edytory, które automatycznie składają nawiasy klamrowe. Używają go do składania swojego kodu w sekcje logiczne, które nie należą do funkcji, klasy, pętli itp., Które zwykle byłyby zwinięte.
źródło
Właściwie to domyślam się, że ktoś zapomniał innego stwierdzenia.
Rzadko jest dobry powód, aby zawracać sobie głowę tworzeniem dodatkowych zakresów blokowych. W tym iw większości przypadków jest o wiele bardziej prawdopodobne, że ktoś zapomniał wpisać oświadczenie kontrolne, niż że robił coś sprytnego.
źródło
Tworzą wewnętrzny zakres. Zmienna zadeklarowana w tych nawiasach klamrowych nie jest widoczna poza nimi. Dotyczy to również C / C ++.
źródło
Nawiasy klamrowe są również przydatne do zmniejszania zakresu w instrukcjach switch / case.
switch(foo) { case BAR: int i = ... ... case BAZ: int i = ... // error, "i" already defined in scope }
Ale możesz pisać
switch(foo) { case BAR:{ int i = ... ... } case BAZ:{ int i = ... // OK } }
źródło
Jest również używany do bloków inicjalizacyjnych .
źródło
static
przeciwnym razie jego instancja bloku inicjalizacji.Definiują nowy zakres, co oznacza, że wszystko zadeklarowane w tym zakresie nie jest widoczne poza nawiasami klamrowymi.
źródło
Co ciekawe: nawiasy klamrowe faktycznie włączają klasę instrukcji: deklaracje.
To jest nielegalne:
if(a) int f;
ale to jest legalne:
if(a) { int f; }
źródło
Myślę, że po prostu definiują nienazwany poziom zakresu.
źródło
Przenieś zakres, kopia nie będzie widoczna poza nim, więc możesz później zadeklarować inną zmienną o tej samej nazwie. I może zostać zebrany przez moduł odśmiecania zaraz po wyjściu z tego zakresu. W tym przypadku kopia służy jako zmienna tymczasowa, więc jest to dobry przykład.
źródło