This is default featured slide 1 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 2 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

Hiển thị các bài đăng có nhãn Lập Trình JAVA. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Lập Trình JAVA. Hiển thị tất cả bài đăng

Thứ Ba, 15 tháng 11, 2016

Nạp chồng phương thức - Overloading method

Nạp chồng phương thức - Overloading method

Khái niệm

Tương tự như khái niệm nạp chồng phương thức trong C++, trong java, nạp chồng phương thức (overloading method) là hiện tượng nhiều phương thức có cùng tên, tuy nhiên số lượng tham số hoặc kiểu của tham số trong các phương thức này là khác nhau.
Chú ý: Các phương thức có cùng tên, cùng danh sách tham số, tuy nhiên, kiểu trả về khác nhau không được xem là hiện tượng overload.

Tác dụng và cơ chế của overload

Sử dụng overload trong một chương trình nhằm tăng khả năng đọc của chương trình.
Trình biên dịch sẽ dựa vào tham số được truyền vào phương thức mà quyết định xem sẽ gọi phương thức nào trong danh sách phương thức overload.

Overload với tham số kiểu cơ bản

Theo định nghĩa thì chúng ta có 2 cách để tạo ra hiện tượng overload:
  • Thay đổi số lượng tham số
  • Thay đổi kiểu dữ liệu của tham số

Thay đổi số lượng tham số

Đây là trường hợp khá đơn giản và dễ nhận biết nhất của hiện tượng overload. Các bạn có thể tham khảo đoạn mã nguồn dưới đây:
  1. public class stdio {
  2. private String author;
  3. private static final String address = "stdio.vn";
  4. stdio(){
  5. author = "Kevin La";
  6. }
  7. stdio(String author_name){
  8. author = author_name;
  9. }
  10. public static void main(String [] args){
  11. //Call no arguments constructor
  12. stdio obj = new stdio();
  13. System.out.println(obj.author);
  14. //Call constructor has a argument
  15. stdio obj1 = new stdio("Alice");
  16. System.out.println(obj1.author);
  17. }
  18. }
Trong đoạn mã nguồn trên, tôi đã thực hiện overload constructor của lớp stdio với 1 constructor không có tham số và 1 constructor có chứa 1 tham số.

Thay đổi kiểu dữ liệu của tham số

Khi có cùng số lượng tham số, trình biên dịch sẽ dựa vào kiểu của đối số được truyền vào phương thức, sau đó đối chiếu với kiểu dữ liệu của tham số của phương thức để chọn ra phương thức thích hợp nhất.
Ví dụ:
  1. public class Calculation {
  2. void add(int param1, int param2){
  3. System.out.println(param1 + param2);
  4. }
  5. void add(float param1, float param2){
  6. System.out.println(param1 + param2);
  7. }
  8. public static void main(String [] args){
  9. Calculation obj = new Calculation();
  10. obj.add(10, 10);
  11. obj.add(10.5f, 10.24f);
  12. }
  13. }
Tại dòng số 10, trình biên dịch sẽ gọi phương thức add ở dòng thứ 2 để thực thi do cả 2 tham số truyền vào đều là kiểu int. Giải thích tương tự với dòng số 11.
Tuy nhiên, ở một khía cạnh khác, tôi muốn đề cập tới hiện tượng ép kiểu và lớp bao trong java được sử dụng như thế nào trong nạp chồng phương thức.
Quan sát ví dụ dưới đây:
  1. public class TestOverload {
  2. void method(Integer param){
  3. System.out.println("_Integer invoked");
  4. }
  5. void method(long param){
  6. System.out.println("_long invoked");
  7. }
  8. public static void main(String [] args){
  9. Calculation obj = new Calculation();
  10. obj.add(10);
  11. }
  12. }
Kết quả là:
  1. _long invoked
Tại dòng số 10, khi truyền 10 là một đối số kiểu int, trình biên dịch sẽ kiểm tra xem có phương thức add nào có tham số là kiểu int hay không, tuy nhiên, trình biên dịch không tìm thấy. Thay vào đó, nó tìm thấy 2 phương thức add có tham số là lớp bao của kiểu int là Integer (dòng số 2) và một kiểu rộng hơn kiểu int là long (dòng số 5). Khi ấy, trình biên dịch sẽ ưu tiên gọi phương thức có tham số có kiểu rộng hơn đối số truyền vào thay vì phương thức có tham số là lớp bao của đối số truyền vào.

Overload và quan hệ kế thừa

Nhắc tới quan hệ kế thừa, chúng ta thường đề cập tới mối quan hệ IS-A. Nói cách khác, một đối tượng thuộc lớp con cũng là một đối tượng thuộc lớp cha. Vì thế, khi thực hiện overload phương thức ta hoàn toàn có thể truyền một đối tượng thuộc lớp con vào một phương thức trong danh sách phương thức overload có tham số mang kiểu dữ liệu của lớp cha.
Quan sát ví dụ sau đây:
  1. class Animal{
  2. }
  3. class Dog extends Animal{
  4. }
  5. public class Test_Animal {
  6. void eat(Animal animal){
  7. System.out.println("Animal eats everything");
  8. }
  9. void eat(Dog dog){
  10. System.out.println("Dogs eat meat");
  11. }
  12. public static void main(String [] args){
  13. Test_Animal obj = new Test_Animal();
  14. Animal animal = new Animal();
  15. Dog dog = new Dog();
  16. Animal animal_obj = new Dog();
  17. obj.eat(animal);
  18. obj.eat(dog);
  19. obj.eat(animal_obj);
  20. }
  21. }
Kết quả:
  1. Animal eats everything
  2. Dogs eat meat
  3. Animal eats everything
Kết quả của 2 dòng đầu tiên hoàn toàn dễ hiểu. Tuy nhiên, kết quả của dòng thứ 3 có thể gây lăn tăn cho bạn đọc. Tôi sẽ giải thích điều này như sau:
Hãy quan sát dòng code số 19 và 23.
  • Tại dòng số 19, ta khởi tạo một đối tượng lớp Dog và gán cho một tham chiếu kiểu Animal (hãy nhớ rằng lớp Dog kế thừa từ Animal). Nói cách khác, ta sử dụng một tham chiếu kiểu Animal tham chiếu tới một đối tượng kiểu Dog.
  • Như vậy, tại dòng 23, khi gọi phương thức eat() theo logic thông thường, thì phương thức eat có tham số kiểu Dog sẽ được gọi, nhưng ở đây, trình biên dịch lại gọi phương thức eat có tham số kiểu Animal. Đó là do, tham chiếu animal_obj chỉ xác định được đối tượng nó tham chiếu thực sự tới là đối tượng nào tại quá trình runtime, điều đó đồng nghĩa với, trong khi biên dịch (compile) animal_obj chưa hề biết đối tượng nó thực sự tham chiếu tới trên heap và trình biên dịch chỉ biết về animal_obj có kiểu dữ liệu là Animal. Trong khi đó, việc quyết định chọn phương thức trong danh sách phương thức overload lại được trình biên dịch quyết định trong quá trình compile. Vì thế, trình biên dịch sẽ quyết định phương thức overload được gọi dựa vào kiểu dữ liệu của tham chiếu (Animal), không phải dựa vào kiểu dữ liệu của đối tượng được tham chiếu trỏ tới (Dog).

Thứ Bảy, 22 tháng 10, 2016

Auto Comment in Eclipse

Class:
- Path: windown/preference/java/code style/code templates/types
/​**
 * ${file_name}
 *
 * version 1.0
 *
 * Date: ${date}
 *
 * copyright
 *
 * Modification Logs:
 * DATE                 AUTHOR          DESCRIPTION
 * -----------------------------------------------------------------------
 * ${date}              PhuNV3              Create
 */​

Method:
- Path: windown/preference/java/code style/code templates/methods



/**
 * @parame ${return_type}
 * @return ${return_type}
 * @throw ${return_type}
 */

Thứ Bảy, 1 tháng 10, 2016

Một số kĩ thuật tối ưu hoá mã nguồn Java - Phần 1

Trong Java việc tối ưu hoá mã nguồn Java là công việc rất quan trọng, nó không chỉ giúp mã nguồn thông thoáng hơn, giúp tiêu tốn ít tài nguyên hệ thống hơn, mà các kĩ thuật được trình bày dưới đây sẽ giúp nâng cao hiệu suất (performance) làm việc của Java khi chạy chương trình!
Một LTV Java có kinh nghiệm luôn coi việc tối ưu hoá mã nguồn như là 1 phần quan trọng của công việc lập trình, trang bị những kĩ thuật, thủ thuật tối ưu sẽ thể hiện một LTV có trình độ, và coi nó như 1 kĩ năng không thể thiếu khi làm việc với Java.
Các kĩ thuật dưới đây không phải là những giải thuật toán học cao siêu, cũng không phải triển khai 1 cách phức tạp, đôi khi chúng rất dễ để thực hiện nhưng rất nhiều LTV không để ý hoặc chưa biết cách để triển khai nó.

I. Các vòng lặp

1. Tránh việc gọi phương thức trong vòng lặp

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Nếu có thể hãy tránh sử dụng cuộc gọi tới các phương thức như length(), size() ... trong vòng lặp, nó sẽ giúp cải thiện hiệu suất
  • Lý do: Việc sử dụng các phương thức trên trong vòng lặp sẽ gây ra rất nhiều cuộc gọi giống nhau và không cần thiết làm tăng xử lý cho chương trình
Ví dụ:
Java
package com.rule;
class Avoid_method_calls_in_loop_violation
{
public void method()
{
        String str = "Hello";
        for (int i = 0; i < str.length(); i++)   // Vi Phạm
        {
          i++;
        }
}
}
Nên được viết thành:
Java
package com.rule;
class Avoid_method_calls_in_loop_correction
{
    public void method()
    {
        String str = "Hello";
        int len = str.length();     // Đẩy size ra bên ngoài vòng lặp
        for (int i = 0; i < len ; i++)
        {
            i++;
        }
 }
}

2. Đưa các tính tóan bất biến ra ngoài vòng lặp

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Các mã nguồn luôn cho ra một kết quả giống nhau qua từng lần lặp nên được di chuyển ra ngoài vòng lặp
  • Lý do: Các tính tóan cho ra kết quả giống nhau, bất biến là không cần thiết phải gọi lại nhiều lần gây ra sự chậm trễ cho chương trình
Ví dụ 1:
Java
package com.rule;
class Loop_invariant_code_motion_violation
{
    public void method(int x, int y, int[] z)
    {
        for(int i = 0; i < z.length; i++)
        {
            z[i] = x * Math.abs(y);     // Vi phạm
        }
    }
}
Nên được viết thành:
Java
package com.rule;
class Loop_invariant_code_motion_correction
{
    public void method(int x, int y, int[] z)
    {
                    int t1 = x * Math.abs(y);       // Điều chỉnh
        for(int i = 0; i < z.length; i++)
        {
            z[i] = t1;
        }
    }
}
Ví dụ 2:
Java
public NamedElement find(NamedElement namedElement)
{ 
     for (NamedElement otherNamedElement : getNamedElements()) { 
          if (namedElement.getName().equals(otherNamedElement.getName())) { //Vi phạm
               return otherNamedElement; 
          }
     } 
               return null; 
}
Nên viết thành:
Java
public NamedElement find(NamedElement namedElement)
{ 
     String name = namedElement.getName(); // Chỉnh sửa
     for (NamedElement otherNamedElement : getNamedElements()) { 
         if (name.equals(otherNamedElement.getName())) { // Chỉnh sửa
​
             return otherNamedElement; 
         }
     } 
             return null; 
}
Tham khảo:
  • Java Performance Tunning by Jack Shirazi
  • The Art of Java Performance Tuning by Ed Merks (Page 20)

3. Tránh nối chuỗi (String) trong vòng lặp

  • Mức độ nghiêm trọng: Rất nghiêm trọng
  • Nguyên tắc: Sử dụng StringBuffer hoặc StringBuilder thay vì sử dụng nối chuỗi String trong vòng lặp
  • Lý do: String là 1 đối tượng bất biến, mỗi khi nối chuỗi gây ra tạo mới đối tượng String, số lần lặp càng lớn càng gây chậm trễ chương trình, tốn tài nguyên xử lý
Ví dụ:
Java
package com.rule;
class String_concatenation_violation
{
    public void concatValues()
    {
        String result = "";
        for (int i = 0; i < 20; i++) 
        {
              result += getNextString();                // Vi phạm
        }
    }
}
Nên được viết thành:
Java
package com.rule;
class String_concatenation_correction
{
    public void concatValues(String strMainString, String strAppend1, String strAppend2)
    {
        String result = "";
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 20; i++) 
 {
     builder.append(getNextString()); // Sử dụng StringBuilder
 }
 result = buffer.toString(); 
 }
}

4. Sử dụng biến tạm thay cho truy cập giá trị của phần tử trong mảng

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Sử dụng biến tạm để lưu trữ dữ liệu và tính toán thay vì truy cập tới giá trị của phần tử trong mảng
  • Lý do: Việc truy cập tới 1 phần tử trong mảng luôn làm tốn chi phí hơn là truy cập tới 1 biến tạm bởi vì máy ảo Java (VM) phải kiểm tra các ràng buộc truy cập tới phần tử đó cũng như phải kiểm tra độ dài của mảng
Ví dụ:
Java
public void setUpArray(int REPEAT) {
     for(int i = 0; i < REPEAT; i++) {
        countArr[0] += 10; // VI PHẠM
     }     
}
Nên viết thành:
Java
public void setUpArray(int REPEAT) {
     int tempCound = coundArr[0]; // ĐẨY VÀO BIẾN TẠM
     for(int i = 0; i < REPEAT; i++) {
       tempCound += 10;  // SỬA CHỮA
        countArr[0] = tempCount; // SỮA CHỮA
     }     
}
Tham khảo:
  • Java Performance Tunning 2nd, by Jack Shirazi (Chapter 7 - Page: 194)

5. Sử dụng Int

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Sử dụng kiểu dữ liệu int cho các chỉ số thay vì sử dụng các kiểu dữ liệu khác
  • Lý do: Sử dụng kiểu dữ liệu Int cho các chỉ số là nhanh nhất so với việc sử dụng bất kì kiểu dữ liệu nào khác. VM được tối ưu để sử dụng kiểu Int.
Ví dụ:
Sử dụng int :
Java
        for(int i = 0; i < Repeat; i++)
là nhanh hơn so với sử dụng bất kì kiểu dữ liệu nào khác
Java
     for(long i = 0; i < Repeat; i++)
     for(double i = 0; i < Repeat; i++)
     for(char i = 0; i < Repeat; i++)
​
Tham khảo:
  • Java Performance Tunning 2nd, by Jack Shirazi (Chapter 7 - 7.1.4)

6. Đặt Try Catch ra ngoài vòng lặp

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Đặt các khối Try/Catch/Finally bên trong vòng lặp có thể làm chậm quá trình thực thi của chương trình
Ví dụ:
Java
package com.rule;
import java.io.InputStream;
import java.io.IOException;
class Place_try_catch_out_of_loop_violation
{
    void method (InputStream is)
     {
         int ZERO = 0;
         int TEN = 10;
         int count = 0;
​
         for (int i = ZERO; i < TEN; i++)
         {
             try            // VIOLATION
             {
                 count += is.read();
             }
             catch (IOException ioe)
             {
                ioe.printStackTrace();
             }
         }
 }
}
​
Nên viết thành:
Java
package com.rule;
​
import java.io.InputStream;
import java.io.IOException;
class Place_try_catch_out_of_loop_correction
{
  void method (InputStream is)
     {
         int ZERO = 0;
         int TEN = 10;
         int count = 0;
​
         try            // Bao Try Catch ra ngoài vòng lặp
         {
             for (int i = ZERO; i < TEN; i++)
             {
                     count += is.read ();
             }
         }
         catch (IOException ioe)
         {
            ioe.printStackTrace();
         }
 }
}

II/ Làm việc với chuỗi

1. Sử dụng String.length() để kiểm tra chuỗi rỗng (empty)

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Sử dụng String.length() để kiểm tra chuỗi rỗng thay vì sử dụng String.equal()
  • Lý do: Phương thức String.equals () là quá mức cần thiết để kiểm tra một chuỗi rỗng. Kiểm tra độ dài của chuỗi là 0 sử dụng String.length() sẽ nhanh hơn.
Ví dụ:
Java
package com.rule;
class Use_String_length_to_compare_empty_string_violation
{
    public boolean isDocEmpty()
    {
                return doc.getContents().equals("");      // VI PHẠM
    }
}
Nên viết thành:
Java
package com.rule;
class Use_String_length_to_compare_empty_string_correction
{
    public boolean isDocEmpty()
    {
                return doc.getContents().length() == 0;     // SỬ DỤNG LENGTH
    }
}
Tham khảo:

2. Sử dụng StringBuffer hoặc StringBuilder (Tham khảo 3. Tránh nối chuỗi (String) trong vòng lặp)

3. Sử dụng equalsIgnoreCase

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Sử dụng phương thức equalsIgnoreCase() để so sánh chuỗi mà không phân biệt hoa thường
Ví dụ:
Java
public class Use_String_equalsIgnoreCase_violation
{
    public void method()
    {
        String str = "APPPERFECT";
        String str1 = "appperfect";
​
        if(str1.toUpperCase().equals(str))      // Violation
        {
            System.out.println("Strings are equals");
        }   
    }
​
}
Nên được viết thành:
Java
package com.rule;
public class Use_String_equalsIgnoreCase_correction
{
    public void method()
    {
        String str = "APPPERFECT";
        String str1 = "appperfect";
​
        if(str1.equalsIgnoreCase(str))      // Correction.
        {
            System.out.println("Strings are equals");
        }   
    }
​
}

4. Tránh sử dụng startsWith()

  • Mức độ nghiêm trọng: Rất Cao
  • Nguyên tắc: Tránh gọi String.startsWith () vì lý do hiệu suất
  • Lý do: Trong native mã nguồn Java String.startsWith () xử lý khá nhiều thứ truớc khi cho ra kết quả, vì vậy giới hạn vùng kiểm tra bằng cách kiểm tra ký tự ở vị trí đầu tiên
Ví dụ:
Java
package com.rule;
class Avoid_startsWith_violation
{
    public void method()
    {
        String sTemp="Data";
        if (sTemp.startsWith("D")) // VIOLATION
        {
            sTemp = "data";
        }
    }
}
Nên được viết thành
Java
package com.rule;
class Avoid_startsWith_correction
{
    public void method()
    {
        final int ZERO = 0;
        final char D = 'D';
        String sTemp="Data"; 
​
        if (sTemp.length () > ZERO && sTemp.charAt(ZERO) == D)  // CORRECTION
        {
            sTemp = "data"; 
        }
    }
}

III/ Các trường hợp khác

1. Sử dụng System.arraycopy()

  • Nguyên tắc: Sử dụng System.arraycopy() cho việc sao chép mảng
  • Lý do: Sử dụng System.arraycopy() là nhanh hơn so với việc sử dụng vòng lặp để sao chép 1 mảng
Ví dụ:
Java
package com.rule;
class Use_System_arrayCopy_violation
{
    public int[] copyArray (int[] array)
    {
        int length = array.length;
        int[] copy = new int [length];
        for(int i=0;i<length;i++)
        {
            copy [i] = array[i];        // VIOLATION
        }
        return copy;
    }
}
Nên viết thành:
Java
package com.rule;
class Use_System_arrayCopy_correction
{
    public int[] copyArray (int[] array)
    {
        final int ZERO = 0;
        int length = array.length;
        int[] copy = new int [length];
        System.arraycopy(array, ZERO, copy, ZERO, length);      // CORRECTION
        return copy;
    }
}
​

2. Tránh lặp lại việc Casting (ép kiểu)

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Chỉ ép kiểu 1 lần sau đó giữ tham chiếu của nó
  • Lý do: Việc lặp đi lặp lại nhiều lần việc ép kiểu khiến việc xử lý chậm trễ hơn
Ví dụ:
Java
package com.rule;
​
import java.awt.Component;
import java.awt.TextField;
class Avoid_repeated_casting_violation
{
    public void method(Component comp)
    {
        ((TextField) comp).setText("");       // VIOLATION
        ((TextField) comp).setEditable(false);  // VIOLATION
    }
}
Nên viết thành:
Java
package com.rule;
​
import java.awt.Component;
import java.awt.TextField;
class Avoid_repeated_casting_correction
{
    public void method(Component comp)
    {
        final TextField tf = (TextField) comp;  // CORRECTION
        tf.setText("");
        tf.setEditable(false);
    }
}
Tham khảo: Java Performance tunning by Jack Shirazi

3. Hủy các cấu trúc if else không cần thiết

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Đơn giản hóa để nâng cao hiệu quả của mã và giảm kích thước của nó.
Ví dụ:
Java
package com.rule;
class Use_ternary_operator_correction
{
    public boolean test(String value)
    {
        if(value.equals("AppPerfect"))        // VIOLATION
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
Nên viết thành:
Java
package com.rule;
class Use_ternary_operator_correction
{
    public boolean test(String value)
    {
          return value.equals("AppPerfect"); // CORRECTION
        }
 }

4. Luôn sử dụng static với hằng số

  • Mức độ nghiêm trọng: Bình thường
  • Nguyên tắc: Nên khai báo static với các biến là hằng số
Ví dụ:
Java
package com.rule;
public class Always_declare_constant_field_static_violation
{
    final int MAX = 1000; // VIOLATION
    final String NAME = "Noname"; // VIOLATION
}
Nên viết thành:
Java
package com.rule;
public class Always_declare_constant_field_static_correction
{
    static final int MAX = 1000; // CORRECTION
    static final String NAME = "Noname"; // VIOLATION
}

5. Tránh check null truớc khi sử dụng so sánh InstanceOf

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Không nên check NULL truớc khi so sánh InstanceOf
  • Lý do: Không cần thiết phải check NULL trong truờwng hợp này, InstanceOf chỉ được so sánh khi đối tượng != NULL, nên việc so sánh là không cần thiết
Ví dụ:
Java
package com.rule;
public class Avoid_null_check_before_instanceof_violation
{
    public void method(Object o)
    {
        if(o != null &&  o instanceof Object)       // Violation.
        {
            // Do Something.
        }   
    }
​
}
Nên viết thành:
Java
package com.rule;
public class Avoid_null_check_before_instanceof_correction
{
    public void method(Object o)
    {
        if(o instanceof Object)     // Correction
        {
            // Do Something.
        }   
    }
​
}

6. Sử dụng mảng dữ liệu nguyên thủy

  • Mức độ nghiêm trọng: Trung Bình
  • Nguyên tắc: Sử dụng mảng dữ liệu nguyên thủy thay vì sử dụng Collection
  • Lý do: Collection có thể chứa trong nó nhiều kiểu dữ liệu (kiểu object, nguyên thủy ...), vì vậy sử dụng mảng nguyên thủy giúp nâng cao hiệu suất chương trình
Ví dụ:
Java
package com.rule;
​
import java.util.Vector;
public class Use_array_of_primitive_type_insteadof_collection_violation
{
    public void method()
    {
        Vector vInt = new Vector(); // VIOLATION
        vInt.add(new Integer(1));
        vInt.add(new Integer(2));
        vInt.add(new Integer(3));
    }
}
Nên viết thành:
Java
package com.rule;
public class Use_array_of_primitive_type_insteadof_collection_correction
{
    public void method()
    {
        int[] arrInt = new int[3]; // CORRECTION
        arrInt[0] = 1;
        arrInt[1] = 2;
        arrInt[2] = 3;
    }
}

7. Tránh show Debug code

  • Mức độ nghiêm trọng: Thấp
  • Nguyên tắc: Nên check Debug truớc khi show Log
  • Lý do: Việc Debugger vốn bản chất chỉ dành cho nhà phát triển, vì vậy hãy loại bỏ hoặc kiểm tra chúng truớc khi thực thi
Ví dụ:
Java
package com.rule;
public void Avoid_debugging_code_violation
{
    private int count =0;
    public int getCount()
    {
        //...
        System.out.println("count ="+count);  // Violation
        return count;
    }
}
Nên viết thành:
Java
package com.rule;
public void Avoid_debugging_code_correction
{
    private int count =0;
    public int getCount()
    {
        if (Debug.ON) 
        {
            System.out.println("count ="+count);  //correction
        }
        return count;
    }
}

8. Tránh việc sử dụng Thread.sleep()

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Không nên sử dụng Thread.sleep vì lý do hiệu suất
Ví dụ:
Java
package com.rule;
class Avoid_call_to_Thread_sleep_violation
{
    public void doTest() throws InterruptedException
    {
        //......
        Thread.sleep(100); // VIOLATION
        //......
    }
}
Nên viết thành:
Java
package com.rule;
class Avoid_call_to_Thread_sleep_correction
{
    public void doTest()
    {
        //......
        this.wait(100); // CORRECTION
        //......
    }
}

8. Tránh sử dụng String.charAt()

  • Mức độ nghiêm trọng: Cao
  • Nguyên tắc: Sử dụng mảng char[] thay vì sử dụng String.charAt();
Ví dụ:
Java
package com.rule;
class Avoid_using_String_charAt_violation
{
    public void method(String str)
    {
        for(int i=0; i<str.length(); i++)
        {
            System.out.println(str.charAt(i));  // VIOLATION
        }
    }
}
Nên viết thành:
Java
package com.rule;
class Avoid_using_String_charAt_correction
{
    public void method(String str)
    {
        char[] carr = str.toCharArray();        // CORRECTION
        for(int i=0; i<carr.length; i++)
        {
            System.out.println(carr[i]);        // CORRECTION
        }
    }
}
Tham khảo:

Trong bài này có sử dụng tài liệu tham khảo:

Nguồn: