10 Common Defects of Java
10:381 .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.
//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; |
// 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
|
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 ? "" : |
0 nhận xét