10 Common Defects of Java

10:38

1 .Do not string concatenated in loop, use StringBuffer instead 

- Khi cộng chuổi String trong vòng lặp thì mỗi lần cộng sẽ tạo ra thêm một vùng nhớ, nhiều lần như vậy sẽ tốn bộ nhớ ram, tốn tài nguyên, sẽ làm giảm performance. Vì lớp ô nhơ trong String có giá trị không thay đổi được, do đó mỗi lần cộng sẽ làm tăng vùng nhớ. Trong trường hợp muốn cộng chuỗi trong vòng lặp này thì dùng StringBuffer hoặc StringBuilder vì 2 cái này có thể thay đổi giá trị trong các vùngnhớ đó, nên nó sẽ k tạo thêm vùng nhớ => đỡ tốn vùng nhớ, tăng performance.
- Trong Java, String là một Class đặc biệt, nguyên nhân là nó được sử dụng một cách thường xuyên trong một chương trình, vì vậy đòi hỏi nó phải có hiệu suất và sự mềm dẻo. Đó là lý do tại sao String có tính đối tượng và vừa có tính nguyên thủy(primitve).
- Khi một chương trình Java được thực thi, nó sẽ yêu cầu Hệ điều hành cấp phát một không gian bộ nhớ để lưu trữ toàn bộ dữ liệu và thông tin của nó.  Sau đó nó sẽ chia vùng không gian đó thành 4 cùng nhớ(Memory Segment) để lưu trữ.

   + Vùng nhớ code (code segment), theo như tên gọi của nó, tất cả mã chương trình (machine code) được lưu ở đây khi chương trình được thực thi.
   + Vùng nhớ data (data segment), đây là nơi lưu trữ những dữ liệu chung của chương trình như các biến static, constant,… những biến dữ liệu mà được sinh ra khi chương trình bắt đầu thực thi và chỉ được giải phóng khi chương trình kết thúc.

   +Vùng nhớ stack (stack segment), đây sẽ là nơi lưu trữ các biến thuộc nhóm kiểu dữ liệu cơ sở (primitive data type như là boolean, int, char,…) và địa chỉ của ô nhớ (memory address).Stack hoạt động theo cơ chế LIFO Last In First Out_Chạy sau chết trước

   +Vùng nhớ heap (heap segment), đây là nơi lưu trữ tất cả các đối tượng (object) được sinh ra trong thời gian thực thi chương trình (run time).( Dung lượng Heap thường lớn hơn Stack)



















//Wrong example:
String stNumber = "";
for(i=0; i<100; i++)
{
stNumber = stNumber + i;
}
// Correct one
StringBuffer stBuf = new StringBuffer();
for(i=0; i<100; i++)
{
stNumber.append(i);
}      
String stNumber = stBuf.toString();

2. Do not get size of array in for statements condition
  Mỗi lần lặp sẽ get lại size of array điều đó làm giảm performance, do đó nên get size of array trước khi vào vòng lặp














// Wrong example:
for(i=0; i<arrTemp.size(); i++)
{
// do smt here
}
// Correct answer:
int intSize = arrTemp.size();
for(i=0; i<intSize; i++)
{
// do smt here
}

3.. Compare a string with a constant, always call equals function from constant to avoid null pointer exception error. 

// Wrong example:
if(stVariable.equals(“”))
{
// do smt here
}
// Correct answer:
if(“”.equals(stVariable)
{
// do smt here
}


4. Avoid select from database to check for existing of values in a loop, this will increase system performance 













// Wrong
for(i=0; i<intSize; i++)
{
// select database to check here
}
// Correct
// Select database, put to a HastTable object or List object. Remember Hastable object do not allow duplicate value
for(i=0; i<intSize; i++)
{
// select the HastTable to check here
}

5. Do not create object in loop 
 Một Object không cần thiết phải tạo nhiều lập lần trong vòn lặp, thì khi mình tạo nhiều object như vậy sẽ tốn thêm vùng nhớ heap => tốn tài nguyên => nên tạo object ngoài vòng lặp
















// Wrong
for(i=0; i<intSize; i++)
{
TableRow objTable = (TableRow) vtResult.getElementAt(i);
// do smt here
}
// Correct
TableRow objTable = null;
for(i=0; i<intSize; i++)
{
objTable = (TableRow) vtResult.getElementAt(i);
// do smt here
}


6. Use toString() function instead of typecast 







// Wrong
String stTemp = x==y ? “” : objABC.toString();
// Correct
String stTemp = x==y ? “” : (String)objABC;

7. Redundant typecast 







// Wrong
String stTemp = Integer.toString(i);
//Correct
String stTemp = “” + i;

8. Database object may not be close when an Exception occur 
 - Phải đóng các kết nối trong dòng lệnh trong finally vì khi có exception xảy ra thì các khối lệnh nằm trong finally vẫn đượn thực hiện, và phải đóng theo thứ tự như là resultset, preparestament, statement, rồi đến connection đóng sau hết.


















































// Wrong
Statement st = null;
ResultSet rs = null;
try{
String stSQL = "SELECT " + tableName + "_seq.nextval AS "+ primaryKey +" FROM DUAL";
st = conn.createStatement();
    rs = st.executeQuery(stSQL);
    if ( rs.next() && (rs.getObject(1) != null) ) {
    long pk = rs.getLong(1);
    //pk = pk + 1;
    tableFieldValues[primaryKeyIndex] = new Long(pk);
    } else {
    tableFieldValues[primaryKeyIndex] = new Long(0);
    }
st.close();
    rs.close();
}
catch(Exception e){
throw new Exception("Error occur: " + e.getMessage());
}
// Correct
Statement st = null;
ResultSet rs = null;
try{
String stSQL = "SELECT " + tableName + "_seq.nextval AS "+ primaryKey +" FROM DUAL";
          st = conn.createStatement();
          rs = st.executeQuery(stSQL);
          if ( rs.next() && (rs.getObject(1) != null) ) {
          long pk = rs.getLong(1);
          //pk = pk + 1;
             tableFieldValues[primaryKeyIndex] = new Long(pk);
          } else {
          tableFieldValues[primaryKeyIndex] = new Long(0);
          }
}
catch(Exception e){
throw new Exception("Error occur: " + e.getMessage());
}
finally
{
try {
rs.close();             //close resultset before close statement
} catch (SQLException sqle) {;}
try {
st.close();
} catch (SQLException sqle) {;}
}

9.Init string object “” instead of null 


// Wrong
String stABC = “”;
// Correct
String stABC = null;


10. Check for null before use objects to avoid null pointer exception







// Wrong
String stAction = request.getAttribute("stAction").toString();
// Correct
String stAction = request.getAttribute("stAction")==null ? "" : 
...

You Might Also Like

0 nhận xét

Popular Posts

Like us on Facebook

Flickr Images

Subscribe