Khai báo nhiều biến trong một lần khai báo có thể gây nhầm lẫn về loại biến và giá trị ban đầu của chúng. Đặc biệt, không khai báo bất kỳ điều nào sau đây trong một tờ khai
- Các loại biến khác nhau
- Một hỗn hợp của các biến được khởi tạo và chưa được khởi tạo
Nói chung, bạn nên khai báo từng biến trên dòng riêng của nó với chú thích giải thích về vai trò của nó. Mặc dù không bắt buộc phải tuân thủ hướng dẫn này, nhưng phương pháp này cũng được khuyến nghị trong Quy ước mã cho ngôn ngữ lập trình Java, §6. 1, "Số trên mỗi dòng" []
Hướng dẫn này áp dụng cho
Ví dụ về mã không tuân thủ [Khởi tạo]
Ví dụ về mã không tuân thủ này có thể khiến lập trình viên hoặc người đánh giá nhầm tưởng rằng cả i
và j
đều được khởi tạo thành 1. Trên thực tế, chỉ có j
được khởi tạo, trong khi i
vẫn chưa được khởi tạo
Giải pháp tuân thủ [Khởi tạo]
Trong giải pháp tuân thủ này, rõ ràng là cả i
và j
đều được khởi tạo thành 1
int i = 1; // Purpose of i... int j = 1; // Purpose of j...
Giải pháp tuân thủ [Khởi tạo]
Trong giải pháp tuân thủ này, rõ ràng là cả i
và j
đều được khởi tạo thành 1
Khai báo từng biến trên một dòng riêng biệt là phương pháp ưa thích. Tuy nhiên, nhiều biến trên một dòng có thể chấp nhận được khi chúng là các biến tạm thời nhỏ chẳng hạn như chỉ số mảng
Ví dụ về mã không tuân thủ [Các loại khác nhau]
Trong ví dụ mã không tuân thủ này, lập trình viên khai báo nhiều biến, bao gồm cả một mảng, trên cùng một dòng. Tất cả các thể hiện của loại
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }4 đều có quyền truy cập vào các phương thức của lớp
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }5. Tuy nhiên, rất dễ quên rằng các mảng cần được xử lý đặc biệt khi một số phương thức này bị ghi đè
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }
Khi một phương thức
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }5, chẳng hạn như
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }7, bị ghi đè, một lập trình viên có thể vô tình cung cấp một triển khai cho loại
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }4 mà không xem xét rằng
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }9 là một mảng của
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }4 chứ không phải là một tham chiếu đến một đối tượng của loại
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }4
public String toString[] { return a.toString[] + b.toString[] + c.toString[] + d.toString[]; }
Tuy nhiên, ý định của lập trình viên có thể là gọi
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }7 trên từng phần tử riêng lẻ của mảng
public class Example { private T a, b, c[], d; public Example[T in] { a = in; b = in; c = [T[]] new Object[10]; d = in; } }9
// Correct functional implementation public String toString[]{ String s = a.toString[] + b.toString[]; for [int i = 0; i < c.length; i++]{ s += c[i].toString[]; } s += d.toString[]; return s; }
Giải pháp tuân thủ [Các loại khác nhau]
Giải pháp tuân thủ này đặt mỗi khai báo trên một dòng riêng và sử dụng ký hiệu ưu tiên cho khai báo mảng
public class Example { private T a; // Purpose of a... private T b; // Purpose of b... private T[] c; // Purpose of c[]... private T d; // Purpose of d... public Example[T in]{ a = in; b = in; c = [T[]] new Object[10]; d = in; } }
khả năng ứng dụng
Khai báo nhiều biến trên mỗi dòng có thể làm giảm khả năng đọc mã và dẫn đến sự nhầm lẫn của lập trình viên
Khi có nhiều hơn một biến được khai báo trong một lần khai báo, hãy đảm bảo rằng cả kiểu và giá trị ban đầu của mỗi biến đều hiển nhiên
Các khai báo của các chỉ số vòng lặp nên được bao gồm trong một câu lệnh
public String toString[] { return a.toString[] + b.toString[] + c.toString[] + d.toString[]; }4 ngay cả khi điều này dẫn đến các khai báo biến thiếu nhận xét về mục đích của biến
public class Example { void function[] { int mx = 100; // Some max value for [int i = 0; i < mx; ++i ] { /* .. */ } } }
Những khai báo như vậy không bắt buộc phải ở một dòng riêng và phần chú thích giải thích có thể được bỏ qua