středa 7. března 2007

Syntaktická cukrátka v Jave 7

Je libo a nelibo synataktická cukrátka?

Java se po vzoru dalších jazyků vydala na cestu přidávání nových syntatktických cukrátek. Podle zveřejněných informací verze 7 zřejmě tento trend jenom potvrdí. Pokud mají syntaktická cukrátka něco společného, pak je to fakt, že rozdělují komunitu ve dví. Co jedni vítají s otevřenou naručí, druzí nemohou strávit.

Kolekce

Inicializace kolekcí (seznam, mapa) pomocí syntaxe pro zápis pole. Že nevíte co mám přsně na mysli? Následující kód Vám to prozradí.

      
 //Java 6 a starší
 List<String> polehouni = new ArrayList<String>();
 polehouni.add("Dagi");
 polehouni.add("NkD");
 polehouni.add("Roumen");       
      
     
      
 //Java 7
 List<String> polehouni = ["Dagi", "NkD", "Roumen"];     
 
 nebo
 
 List<String> polehouni = new ArrayList() ["Dagi", "NkD", "Roumen"];
      
     

Pro mapu by zápis mohl vypadat následovně.

      
 //Java 7
 Map<String, Integer>  = ["Abba" : 1972, "Beatles" : 1960, "Corrs" : 1995];
      
     

Operátory

Přetížení aritmetických operátorů pro BigDecimal a BigInteger.

       
 //Java 6 a starší
 BigInteger c;
 BigInteger a = new BigInteger(1);
 BigInteger b = new BigInteger(1);
 c = a.add(b);
      
     
       
 //Java 7
 BigInteger c;
 BigInteger a = new BigInteger(1);
 BigInteger b = new BigInteger(1);
 c = a + b;
      
     

Property

Navrhované změny se týkají přístupu a definice k bean propertám.

       
 //Java 6 a starší
 public class Auto {
   private int barva;
   
   public void setBarva(int barva) {
     this.barva=barva;  
   } 
   
   public int getBarva() {
     return this.barva;
   }
 }          
       
     
       
 //Java 7
 public class Auto {
   public int property barva;
 }          
       
     

Pro přístup k jednotlivým propertám by se místo jména gettru/settru použije speciální znak (.,#, ->).

       
 //Java 6 a starší
 Auto auto = new Auto();
 auto.setBarva(10);
 int barva = auto.getBarva(); 
       
     
      
 //Java 7
 Auto auto = new Auto();
 auto->barva = 10;
 int barva = auto->barva;      
      
     

Closures

Nový datový typ - funkce. Náhrada anonymních vnitřních tříd. Více se dočtete v dříve publikovaném článku Closures v Jave - funkce se bouří.

Jak jsem psal již výše tyto změny nenechájí klidného opravdu nikoho. Ne všechno je ještě posvěceno a většina z výše uvedených cukříků je ve stádui návrhu. To znamená, že není jisté jestli se do Javy 7 dostanou. Ač bych například definici kolekcí výše zmíněným způsobem uvítal, nejsem obecně příznivcem rozšiřování syntaxe.

Proti rozšiřování syntaxe hovořili v minulosti dva hlavní faktory, od Javy 6 jsou to dokonce faktory tři.

  1. Boří zpětnou kompatibilitu zdrojového kódu.
  2. Znepřehledňují syntaxi (výjimka zavádějí nový rozměr).
  3. Pro podobné zefektivnění je zde podpora dalších jazyků v JVM.

Na jednu stranu rozumím, že se vývojáři Javy snaží držet syntaxi konkurenceschopnou, ale na druhou stranu si kladu otázku: Proč se tenhle boj nenechá vybojovat skriptovacím jazykům na JVM?

Související články