Tuesday, March 20, 2012

Một số cái mới trong Java 7

Dạo này lắm việc quá ko có gì note lại đây. Tình cờ hôm qua đọc thử sách trên Amazon Kindle thấy hay nên note lại đây cho mình và cho những người chưa biết.
Những thay đổi này thực sự có ích cho các bạn lập trình let's start.
1, Diamond Operator: Chắc hẳn bạn đã làm việc với kiểu Generics ví dụ bạn khai báo một map:
Map <String, List<Trade>> trades = new TreeMap<String, List<Trade> >();
Bạn có nhìn thấy thừa không, bạn cần khai báo loại map ở cả hai phía.
Nhưng với Java 7 bạn có thể khai báo như sau:
Map <String, List<Trade>> trades = new TreeMap<>();
Trình biên dịch sẽ tự động hiểu bạn cần khai báo gì.
2, Sử dụng String trong câu lệnh switch: Bạn còn nhớ, trước đây khi dùng switch statements bạn bắt buộc phải sử dụng với kiểu dữ liệu đếm được thì nay với Java 7 bạn có thể làm việc đó với cả String, đỡ phải viết if/else nhiều. Sướng nhá!
Thay vì phải khai báo:
private void processTrade(Trade t) {
 String status = t.getStatus();
 if (status.equalsIgnoreCase(NEW)) {
  newTrade(t);
 } else if (status.equalsIgnoreCase(EXECUTE)) {
  executeTrade(t);
 } else if (status.equalsIgnoreCase(PENDING)) {
  pendingTrade(t);
 }
}
Với Java 7 bạn có thể:
public void processTrade(Trade t) {
 String status = t.getStatus();
 switch (status) {
  case NEW:
   newTrade(t);
   break;
  case EXECUTE:
   executeTrade(t);
   break;
  case PENDING:
   pendingTrade(t);
   break;
  default:
   break;
 }
}
3, Tự động quản lý tài nguyên: Chắc chắn một điều tiên quyết mà ai cũng phải nhớ "Đã mở thì phải đóng" nghĩa là bạn mở một cái gì đó, khi làm xong bạn phải đóng lại.
Giống như các Connections, Files, Input/OutStreams...
Bình thường bạn sẽ phải lập trình như sau:
public void oldTry() {
 try {
  fos = new FileOutputStream("tmp.txt");
  dos = new DataOutputStream(fos);
  dos.writeUTF("blog.vn-dev.net");
 } catch (IOException e) {
  e.printStackTrace();
 } finally {
  try {
   fos.close();
   dos.close();
  } catch (IOException e) {
   // log the exception
  }
 }
}
Chú ý java vitual machine chỉ có thể tự quản lý những thằng inplement interface AutoCloseble thôi nhé :).
Nay với Java 7 bạn ko cần phải đóng những gì đã mở :D, nhưng như thế nghe vẻ hơi mất đi tính logic của nó "Mở là phải đóng" nhỉ.
4, Khai báo number với gạch dưới: Đã bao giờ bạn khai báo tới hàng tỷ mà bạn phải đếm những số 0 trong đó, nó mà lớn hơn nữa thì cũng mệt phết. Với Java 7 bạn làm cho phép khai báo số với gạch dưới, vì thế việc "Đếm" rất đơn giản:
Bạn có thể khai báo như sau:
int thousand =  1_000;
int million  =  1_000_000;
int one = 1;
Với số nhị phân bạn cũng có thể sử dụng phương pháp này ví dụ: 0b1
Nhưng bạn không thể convert nó sang số thập phân nữa đâu nhé :)
5, Multi-catch trong Exception: Trước đây với một phương thức bắn ra nhiều Exception, bạn cần khai báo nhiều block catch để bắt chúng. Ví dụ:
public void oldMultiCatch() {
 try {
  methodThatThrowsThreeExceptions();
 } catch (ExceptionOne e) {
  // log and deal with ExceptionOne
 } catch (ExceptionTwo e) {
  // log and deal with ExceptionTwo
 } catch (ExceptionThree e) {
  // log and deal with ExceptionThree
 }
}
Nhưng với Java 7 bạn có thể gộp các block catch kia lại giống như:
public void oldMultiCatch() {
 try {
  methodThatThrowsThreeExceptions();
 } catch (ExceptionOne | ExceptionTwo | ExceptionThree e) {
  // log and deal with all Exception
 }
}


Còn một số phần mới về NIO 2.0 mình sẽ note lại vào ngày mai.