2014. november 18., kedd

A Java Standard Edition 7 újdonságai

A munkámból adódóan sok vállalatnál megfordulok és azt látom, hogy a legtöbb helyen még mindig csak a Java 6-os verzióját használják annak ellenére, hogy 2014 március óta már a Java SE 8 is elérhető. Habár a hivatalos roadmap szerint a Java SE 7 publikus frissítései csak 2015 áprilisig várhatóak, érdemes a legfontosabb újdonságokat megismerni, mert azok természetesen a Java SE 8 verzióban is használhatók. Ezekből feature-ökből gyűjtöttem most össze néhányat.

1. Numerikus literáloknál aláhúzásjel használata

Az aláhúzásjelek használatának a célja, hogy megkönnyítse a számok olvashatóságát.
class Numbers {
 public static void main(String args[]) {
  int i = 1_000_000;
  long m = 9_999_999_999_999L;
  double pi = 3.14_15;
 }
}

2. String használata switch szerkezetben

A String equals() metódusával lesz kiértékelve a kifejezés. Érdemes tudni, hogy a Java compiler hatékonyabb bytekódot generál ebben az esetben, mintha az if-else szerkezetet használnánk!
class StringSwitch {
 public static void main(String args[]) {
  String fruit = "apple";
  switch (fruit) {
   case "orange":
    System.out.println("orange");
    break;
   case "apple":
    System.out.println("apple");
    break;
   case "banana":
    System.out.println("banana");
    break;
  }
 }
}

3. Erőforrások automatikus lezárása (try-with-resource)

Az erőforrások automatikusan lezárásra kerülnek, ha a try-with-resource szerkezetben, AutoCloseable vagy a Closeable interfészt implementáló osztályokat használunk.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

class TryWithResousrce {
 public static void main(String args[]) throws IOException {
  try (BufferedReader br = new BufferedReader(
                           new FileReader("c:/temp/myfile.txt"));
   PrintWriter pw = new PrintWriter(
                    new FileWriter("c:/temp/myfile.txt"))) {
   pw.println("mytext");
   pw.flush();
   System.out.println(br.readLine());
  }
 }
}

4. Multi Catch

A kód duplikáció elkerülése miatt hasznos, amikor ugyanazt a kivétel lekezelő műveletet szeretnénk használni unrelated kivételek esetén, anélkül hogy a közös ősüket kellene elkapnunk.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

class MultiCatch {
 public static void main(String args[]) {
  try {
   BufferedReader br = 
    new BufferedReader(new FileReader("myfile.txt"));
   Connection con = DriverManager
    .getConnection("jdbc:postgresql://myhost/db","u","p");
  } catch (IOException | SQLException ce) {
   //handle exceptions
  }
 }
}

5. Precise ReThrow

Nem kapunk fordítási hibát annak ellenére, hogy a kivétel lekezelő ágban feldobott e objektum általánosabb, mint a throws-nál deklarált FileNotFoundException, mivel a fordító képes meghatározni, hogy a kivétel aktuális típusa ebben az esetben FileNotFoundException lesz.
import java.io.FileNotFoundException;

public class PreciseReThrow {

 public static void main(String args[]) 
                                throws FileNotFoundException {
  try {
   throw new FileNotFoundException();
  } catch (Exception e) {
   throw e;
  }
 }
}

6. Diamond operátor használata

Az olvashatóság megkönnyítése érdekében, a jobb oldalról elhagyhatjuk a generikus típus paramétereket a <> operátor kiírásával.
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class DiamondUsage {
 public static void main(String args[]) {
  List<String> list1 = new ArrayList<>();
  List<Map<Integer,List<Double>>> list2 = new ArrayList<>();
 }
}
Persze a lista koránt sem teljes, érdemes még megismerni a NIO 2, a Concurrency API és a JDBC 4.1 újdonságait is mert hasznosak lehetnek a munkánk során és az 1Z0-804 vizsgán is kérdezhetik! .)

2014. november 7., péntek

Oracle 1Z0-804 vizsga feladatok

Ebben a bejegyzésben összegyűjtöttem néhány feladványt az 1Z0-804 vizsga kérdésekből, amelyek tipikusan jellemzik a feladatokat. A vizsgán 90 feladatot kell megoldani 150 perc alatt, amiből legalább 65%-ot kell teljesíteni! A feladatok egy része a lexikális Java API tudásra épít (pl. milyen konstruktorai vannak a Locale osztálynak) a többi pedig az alábbi példákhoz hasonló mit ír ki program:

1. Enum 
  
public enum Book {
 BEGINNER, INTERMEDIATE;

 static {
  System.out.println("static init block");
 }

 {
  System.out.println("instance initializer");
 }

 Book() {
  System.out.println("constructor");
 }

 public static void main(String... args) {
  System.out.println(Book.BEGINNER);
 }
}

2. Integer
  
public class MyInteger {
 public static void main(String[] args) {
  Integer i1 = 127;
  Integer i2 = 127;
  Integer i3 = 128;
  Integer i4 = 128;
  if (i1 == i2)
   System.out.println("same");
  else
   System.out.println("different");

  if (i3 == i4)
   System.out.println("same");
  else
   System.out.println("different");
 }
}

3. CopyOnWriteArraySet
  
public class MyCopy {
 public static void main(String[] args) {
  Set<String> set = new CopyOnWriteArraySet<String>();
  set.add("2");
  Iterator<String> iter = set.iterator();
  set.add("3");
  while (iter.hasNext()) {
   System.out.print(iter.next() + " ");
  }
 }
}

4. Overload
  
class MyOverLoad {
 private void overload(Object o) {
  System.out.println("Object");
 }

 private void overload(double[] arr) {
  System.out.println("double []");
 }

 private void overload(double arr) {
  System.out.println("double");
 }

 private void overload(int arr) {
  System.out.println("int");
 }

 private void overload() {
  System.out.println("void");
 }

 public static void main(String[] args) {
  new My().overload(null);
 }
}

5. Calendar
  
class MyCalendar {
 public static void main(String[] args) {
  DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.US);
  Calendar c = Calendar.getInstance();
  c.set(Calendar.YEAR, 2012);
  c.set(Calendar.MONTH, 12);
  c.set(Calendar.DAY_OF_MONTH, 1);
  System.out.println(df.format(c.getTime()));
 }
}

6. TreeSet
  
class MyTreeSet {
 public static void main(String[] args) {
  TreeSet<StringBuilder> treeSetNames = new TreeSet<StringBuilder>();
  treeSetNames.add(new StringBuilder("aaa")); 
  treeSetNames.add(new StringBuilder("bbb"));
  treeSetNames.add(new StringBuilder("ccc"));
  treeSetNames.add(new StringBuilder("ddd"));
  Iterator it = treeSetNames.descendingIterator();
  while (it.hasNext())
   System.out.print(it.next() + ":");
 }
}

és a megoldások:

1. Enum
instance initializer
constructor
instance initializer
constructor
static init block
BEGINNER

2. Integer:
same
different

3. CopyOnWriteArraySet:
2

4. Overload:
double []

5. Calendar:
January 1, 2013

6. TreeSet:
java.lang.ClassCastException