Můžete ukládat proměnnou uvnitř if-doložky?

hlasů
14

Jsem trochu čekal na ‚ne‘ odpověď na tuto otázku.

Zajímalo mě, jestli můžete uložit proměnné ve stejné době, kdy jej kontrolu v IF-klauzule.

Řekněme, že mám tento kód.

if(foo!=null){
  if(foo.getBar()!=null){
    Bar bar = foo.getBar();
    System.out.println(Success:  + bar);
  } else {
    System.out.println(Failure.);
  }
} else {
  System.out.println(Failure.);
}

Manipulace s I teď na „selhání“ -states samostatně, a to i v případě, že výsledek je stejný. Jsem jim mohl dát dohromady takto:

if(foo!=null && foo.getBar()!=null){
  Bar bar = foo.getBar();
  System.out.println(Success:  + bar);
} else {
  System.out.println(Failure.);
} 

Mnohem úhlednější kód již. pokud foo je null, že se tam zastaví a nebude snažit foo.getBar (v if), tak jsem se nedostal NPE. Poslední věc, kterou bych chtěl zlepšit, a hlavní otázkou: Opravdu dal vyzvat foo.getBar (dvakrát)? Bylo by hezké dostat pryč od druhého identického hovoru, pokud getBar () by byl velmi těžký provoz. Takže jsem přemýšlel, jestli je nějak možné udělat něco podobnými jako tento:

if(foo!=null && (Bar bar = foo.getBar())!=null){
  Bar bar = foo.getBar();
  System.out.println(Success:  + bar);
} else {
  System.out.println(Failure.);
}

Budu muset rozdělit to na dvě odlišná, pokud by opět to, jestli bych chtěl dělat

Bar bar = foo.getBar();
if (bar!=null) ...
Položena 19/02/2009 v 08:47
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
28

To je nejbližší můžete získat:

Bar bar;
if(foo!=null && (bar = foo.getBar())!=null){
  System.out.println("Success: " + bar);
} else {
  System.out.println("Failiure.");
}
Odpovězeno 19/02/2009 v 08:53
zdroj uživatelem

hlasů
11

Při iterace přes řádky z BufferedReader Použil jsem tuto techniku:

BufferedReader br = // create reader
String line
while ((line = br.readLine()) != null) {
    // process the line
}

Takže ano, můžete provést úkol a výsledek off, které bude na levé straně straně variabilní, které pak můžete zkontrolovat. Nicméně, to není legální deklarovat proměnné uvnitř testu, protože by pak byl rozsahem pouze s tímto výrazem.

Odpovězeno 19/02/2009 v 08:52
zdroj uživatelem

hlasů
7

Chcete-li omezit rozsah Bar bych přidat {a} kolem kódu, který Michael vyslán.

void foo ()
{
    // nějaký kód ...

    // tento blok omezuje rozsah „Bar“, tak, že zbytek způsobu nevidí 
    // to.
    {
        Bar bar;
        v případě (foo! = null && (bar = foo.getBar ())! = null) {
            System.out.println ( "Success" + bar);
        } Else {
            System.out.println ( "Failiure.");
        }
    }
}

Můžete také chtít zkontrolovat do null object, pokud to má smysl. Já osobně se snažit, aby se zabránilo věci jsou null, jestli můžu ... vážně přemýšlet o tom, chcete-li null, které mají být povoleny, nebo ne.

Odpovězeno 19/02/2009 v 09:07
zdroj uživatelem

hlasů
2

Z oddělení „Moje programovací jazyk je lepší než vaši programovací jazyk“: V Groovy , můžete použít „?“. operátor:

Bar bar = foo?.bar
if (bar != null) {
}

V jazyce Java, je to dobrý vzor (*):

Bar bar = foo == null ? null : foo.getBar();
if (bar != null) {
}

*: Něco, co lze uložit do svých prstů.

Odpovězeno 19/02/2009 v 11:34
zdroj uživatelem

hlasů
1

Tři body, které zcela nedokážou odpovědět na otázku:

nullje zlo. Nepište metody, které ji vrátit. Váš příklad problém by pak zmizí.

Myslím, že byste mohli být přijdou o zapouzdření. Místo toho foo.getBar()by mohl rozhraní foobýt vyrobeny tak, že jste provést „řekni neptej“ operaci?

Vedlejší účinky v expresi tendenci způsobovat špatný kód. Raději více jednodušších řádky méně, kočárku linky. Obvyklou výjimkou v případě použití ++pro zvýšení indexu při přístupu k vyrovnávací paměti, nebo podobné algoritmy iterátor stylu.

Odpovězeno 19/02/2009 v 14:06
zdroj uživatelem

hlasů
0

Ve skutečnosti si myslím, že je to způsob, jak to udělat pomocí Java volitelný, zde je příklad:

Optional.ofNullable("text").ifPresent( $0 -> {
  System.out.println($0.toUpperCase());
});

Nebo ve vašem případě:

  if(foo != null){
      Optional.ofNullable(foo.getBar()).ifPresent(bar -> {
          System.out.println("Success: " + bar);
      });
  }
Odpovězeno 22/03/2018 v 14:02
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more