Làm nhanh việc viết mã Java trong Eclipse Galileo

Sử dụng bộ tạo mã toString() mới

Hãy tìm hiểu cách sử dụng khả năng tạo mã toString() mới trong Eclipse Galileo cùng với các phương thức hashCode(), equals(), và quá trình tạo trình thiết đặt/thu nhận để giảm bớt số lượng công việc xây dựng nền tảng của một lớp Java™ .

Nathan A. Good, Kỹ sư trưởng, tư vấn, Freelance Developer

Nathan Good sống tại vùng Twin Cities của bang Minnesota. Về chuyên môn, ông làm công việc phát triển phần mềm, kiến trúc phần mềm và quản trị các hệ thống. Khi ông không viết phần mềm, ông rất thích xây dựng các máy chủ và máy tính cá nhân, đọc và làm việc với các công nghệ mới và cố gắng khuyến khích bạn bè của mình chuyển sang phần mềm mã nguồn mở



30 09 2010

Mẹo để tạo mã này sử dụng các tính năng mới đã giới thiệu trong Eclipse Galileo. Tuy nhiên, bạn có thể sử dụng vài kỹ thuật được nêu trong bài này — chẳng hạn tạo các trình thiết đặt và thu nhận — cũng như trong phiên bản cũ của Eclipse, chẳng hạn như Ganymede.

Tổng quan về tạo mã

Trong số các tính năng mà tôi sử dụng hàng ngày trong Eclipse, thì các hạng mục trong thực đơn Source để tạo mã là đứng đầu danh sách. Tôi cần có một chút thời gian để tìm hiểu cách sử dụng chúng một cách hiệu quả, nhưng khi đã hiểu rõ, tôi có thể xây dựng các lớp Java rất nhanh.

Ví dụ khi tạo lớp mới, tôi không phải tốn thời gian để viết các trình thiết đặt và thu nhận (các trình phụ). Tôi không viết hầu hết các trình kiến thiết. Thay vào đó, tôi tạo lớp và nhanh chóng nhập các biến riêng tôi sẽ dùng trong lớp, như những biến trong Liệt kê 1.

Liệt kê 1. Các biến riêng
public
 class Automobile { private String make; private String model; private String year; }

Khi viết xong, tôi nhấn Source > Generate Getters and Setters, rồi chọn các biến riêng vừa nhập mà tôi muốn diễn tả khi dùng các trình phụ chung. Để khởi tạo vài biến trong các biến đó bằng trình kiết thiết, tôi nhấn Source > Generate Constructor using Fields để nhanh chóng tạo chúng. Bằng một vài cú nhấn chuột, tôi đã có một lớp gần như hoàn chỉnh, tuỳ thuộc vào những gì mà tôi muốn làm với lớp đó (xem Liệt kê 2). Điều hay nhất là mã vừa mới được tạo sẽ tôn trọng các quy tắc định dạng mã mà tôi đã thiết lập trong các lựa chọn Eclipse của mình.

Liệt kê 2. Trình kiến thiết tự động tạo mã và các trình phụ
public class Automobile { 
  private String make; 
  private String model; 
  private String year; 
  public String getMake() { 
     return make; 
  } 
  public Automobile(String make, String model, String year) { 
    super(); 
    this.make = make;
    this.model = model; 
    this.year = year; 
  } 

  public void setMake(String make) { 
    this.make = make; 
  } 

  public String getModel() { 
    return model; 
  } 

  public void setModel(String model) { 
    this.model = model; 
  } 

  public String getYear() { 
    return year; 
  } 

  public void setYear(String year) {
    this.year = year; 
  } 
}

Ngoài các mã mà bạn có thể tạo với các mục trong thực đơn Source, bạn có thể tạo rất nhiều mã bằng cách sử dụng phím tắt Ctrl+Space để viết nhiều khối mã phổ biến. Để tìm ra các tên mà bạn cần sử dụng để tạo các khối riêng, hãy nhìn cửa sổ Preferences. Ví dụ, bạn gõ chữ lazy, sau đó nhấn Ctrl+Space để tạo mã Java mà bạn có thể sử dụng để tải mã lazy.


Các cài đặt cho việc tạo mã

Bạn sửa đổi thiết lập đối với việc tạo mã các phương thức mới trong cửa sổ Preferences, dưới Java > Code Style > Code Templates.

Hình 1. Các lựa chọn của Java > Code Style > Code Templates
Các lựa chọn của Java> Mã Style> Code Templates

Mã hóa các thực hành tốt nhất của bạn

Là lãnh đạo kỹ thuật của vài dự án, tôi đã xác định một vài thực hành tốt nhất mà tôi muốn sử dụng cho dự án của chúng tôi. Tôi đặt chúng trong khuôn mẫu của mã Java và làm chúng sẵn sàng để cho các thành viên trong nhóm nhập khẩu.

Các thiết lậpJava > Editor > Code Templates trong cửa sổ Preferences liệt kê các khuôn mẫu theo tên (xem hình 2). Hãy nhìn qua các khuôn mẫu đi với Eclipse. Bạn có thể bổ sung khuôn mẫu của riêng và thậm chí cũng có thể nhập khẩu chúng.

Hình 2. Các lựa chọn khuôn mẫu của Java > Editor > Code
Các lựa chọn khuôn mẫu của Java> Editor> Code

Sử dụng bộ tạo mã toString()

Một tính năng mới trong Eclipse Galileo là khả năng tạo phương thức toString(). Theo mặc định, phương thức toString() in ra đại diện của lớp mà có thể không thực sự hiển thị các thuộc tính ta muốn xem. Hãy xem xét phương thức main trong Liệt kê 3.

Liệt kê 3. In ứng dụng Automobile bằng cách sử dụng phương thức toString()
public class Main { 
  public static void main(String[] args) { 
    Automobile auto = new Automobile("Toyota", "Corolla", "1993"); 
    System.out.println(auto.toString()); 
  } 
}

Kết quả của ứng dụng này được thấy trong liệt kê 4.

Liệt kê 4. Kết quả từ phương thức Main
Automobile@77df38fd

Trước khi có Galileo, tôi phải viết phương thức toString() thủ công. Mặc dù đây không phải là điều cấm đối với lớp nhỏ này, nhưng nếu lớp có nhiều trường hơn, thì sẽ mất thời gian. Tôi muốn làm nhiều thứ hơn là ghép đơn giản các giá trị: Tôi muốn kiểm tra các giá trị rỗng. Có thể tôi muốn sử dụng tính năng StringBuilder to để đạt hiệu suất tốt hơn. Nhưng với Galileo, tôi có thể làm tất cả những điều này với Source > Generate toString(), như thể hiện trong hình 3.

Hình 3. Tạo phương thức toString()
Tạo phương thức toString()

Sau khi nhấn nút Finish, phương thức toString() mới trông như liệt kê 5.

Liệt kê 5. Phương thức toString() được tạo tự động
... @Override public String toString() { 
    return "Automobile [" + (make != null ? "make=" + make + ", " : "") +
    (model != null ? "model=" + model + ", " : "") + (year != null ? "year=" + year :
    "") + "]"; } ...

Bây giờ, khi phương thức main chạy, thì kết quả đầu ra trông như trong Liệt kê 6.

Liệt kê 6. Kết quả đầu ra của phương thức toString() được tự động tạo
Automobile [make=Toyota, model=Corolla, year=1993]

Định dạng chuỗi

Mặc dù kết quả đầu ra thấy trong liệt kê 6 có ý nghĩa mô tả nhiều hơn rất nhiều so với kết quả đầu ra ban đầu trong liệt kê 4, nhưng nó thậm chí có thể tốt hơn để điều chỉnh một chút định dạng để dễ đọc hơn, ví dụ như: "1993 Toyota Corolla (Automobile)". Các khuôn mẫu tuỳ chỉnh cho phép bạn điều chỉnh kết quả đầu ra mà phương thức toString() tạo nên.

Hãy hủy bỏ phương thức toString() và nhấn Source > Generate toString() một lần nữa. Lần này bạn:

  1. Nhấn Edit ở bên cạnh danh sách thả xuống String format .
  2. Nhấn New.
    Hình 4. Thêm một định dạng mới
    Thêm một định dạng mới
  3. Gõ nhập một giá trị nào đó, chẳng hạn như ${member.value} ${otherMembers} (${object.className}) tại mục Pattern, đặt tên cho nó và nhấn OK.

Với khuôn mẫu mới được lựa chọn, bạn nhấn OK tại mục Generate toString(). Mã mới trông giống như trong Liệt kê 7.

Liệt kê 7. Phương thức toString() được cập nhật
... @Override public String toString() { 
    return (make != null ? make + " " : "") + (model != null ? model + " "
    : "") + (year != null ? year : "") + " (Automobile)"; } ...

Bây giờ, khi bạn chạy các phương thức main, kết quả đầu ra của toString() của đối tượng Automobile trông giống như liệt kê 8.

Liệt kê 8. Kết quả từ phương thứctoString() của đối tượng Automobile
Toyota Corolla 1993 (Automobile)

Làm việc với mảng

Bộ tạo mã toString() cũng cho bạn khả năng xử lý các mảng. Hãy xem xét liệt kê 9, trong đó cho thấy một mảng mới của chuỗi được gọi là tùy chọn.

Liệt kê 9. Các tùy chọn mảng chuỗi
Automobile auto = new Automobile("Toyota", "Corolla", "1993"); 
String[] options = 
    new String[] { "Automatic Transmission", "Power Brakes", "Power Windows" }; 

// new generated method after adding 
private String[] options; auto.setOptions(options);
System.out.println(auto.toString()); 

// prints this: 
// Toyota Corolla [Ljava.lang.String;@defb836 1993 (Automobile)

Thông thường, phương thức toString() nguyên thủy in ra thể hiện của mảng giống như thứ tự ban đầu của đối tượng, không thực sự hiển thị nội dung. Tuy nhiên, tùy chọn List contents of arrays instead of using native toString thay đổi điều này. Với tùy chọn được lựa chọn, phương thức toString() có thể được tạo lại, và kết quả đầu ra mới trông giống như liệt kê 10.

Liệt kê 10. Kết quả của phương thức toString() được tạo lại
Toyota Corolla [Automatic Transmission, Power Brakes, Power Windows] 1993 (Automobile)

Hạn chế kết quả đầu ra

Nếu vài mảng có kích thước rất lớn, bạn có thể giới hạn nội dung in ra bằng cách chọn Limit number of items in arrays/collections/maps và thiết lập giới hạn (xem hình 5). Làm như vậy bạn ngăn phương thức toString() khỏi in ra nhiều.

Hình 5. In nội dung mảng với hạn chế
In nội dung mảng với hạn chế

Bạn hãy xem bảng liệt kê 11, là một ví dụ về giới hạn kết quả đầu ra được thiết lập với số lượng là 2.

Liệt kê 11. Hạn chế nội dung của mảng với số lượng 2
Toyota Corolla [Automatic Transmission, Power Brakes] 1993 (Automobile)

Sử dụng hashCode()equals()

Sử dụng tạo mã hashCode()equals() của Eclipse Galileo thực sự có ích khi bạn muốn tạo các quy tắc cho phép các đối tượng của bạn đều dựa trên giá trị thực trong các trường. Điều này khác với hành vi equals() mặc định vì thậm chí các đối tượng với các giá trị giống nhau theo mặc định sẽ không bằng nhau. Ta hãy xem mã trong liệt kê 12.

Liệt kê 12. Hành vi mặc định của phương thức equals()
public class Main { 
  public static void main(String[] args) { 
    Automobile auto = new Automobile("Toyota", "Corolla", "1993"); 
    String[] options = new String[] { "Automatic Transmission", 
                       "Power Brakes", "Power Windows" }; 
    auto.setOptions(options); 
    Automobile auto2 = new Automobile("Toyota", "Corolla", "1993"); 
    String[] options2 = new String[] { "Automatic Transmission", 
                       "Power Brakes", "Power Windows" };
    auto2.setOptions(options2); 
    System.out.println("Autos 1 and 2 are equal(): " + auto.equals(auto2)); 
  } 
}

Mặc dù tất cả các thuộc tính được thiết lập với các giá trị như nhau, nhưng mã in ra kết quả Auto 1 and 2 are equal(): false khi được thực hiện.

Để thay đổi hành vi này, hãy nhấn Source > Generate hashCode() and equals() để tạo phiên bản mới của phương thức equals() nó so sánh tất cả các trường, giống như liệt kê dưới đây.

Liệt kê 13. So sánh tất cả các trường ở phương thức equals() mới
@Override public int hashCode() { // snipped... } 
@Override public boolean equals(Object obj) { 
  if (this == obj) return true; 
  if (obj == null) return false; 
  if (getClass() != obj.getClass()) return false; 

  Automobile other = (Automobile) obj; 
  if (make == null){ 
     if (other.make != null) return false; 
  } else if (!make.equals(other.make)) return false; 

  if (model == null) { 
     if (other.model != null) return false; 
  } else if (!model.equals(other.model)) return false; 

  if (!Arrays.equals(options, other.options)) return false; 

  if (year == null) { 
     if (other.year != null) return false; 
  } else if (!year.equals(other.year)) return false; 
  return true; 
}

Bây giờ, khi bạn thực thi mã, hai đối tượng được so sánh bằng cách sử dụng phương thức equals() đè lên, và chúng đều bằng nhau.

Một tính năng mới trong Eclipse Galileo là khả năng tạo các khối cho câu lệnh if. Rất tuyệt khi có tính năng mới này nếu bạn chưa có tính năng Source > Clean Up được cấu hình để thay đổi các câu lệnh dòng đơn if cho các khối. Việc tránh các câu lệnh dòng đơn if thường được coi là thực hành tốt nhất, vậy nhiều người muốn chắc rằng họ có điều này trong mã của họ.


Kết luận

Các tính năng mới trong Galileo để tạo các phương thức toString() được thêm vào khả năng hiện có trong Eclipse để tạo rất nhiều mã Java. Thông qua việc thực hành, bạn có thể học được mã nào cần gõ và mã nào bạn có thể tạo, để ít phải làm việc hơn.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

  • Các nhóm tin của Nền tảng Eclipse là điểm dừng chân đầu tiên của bạn để thảo luận về các vấn đề liên quan đến Eclipse. (Lựa chọn này sẽ khởi chạy ứng dụng mặc định đọc tin tức Usenet của bạn và mở eclipse.platform.)
  • Các nhóm tin về Eclipse cung cấp nhiều tài nguyên cho những người quan tâm đến việc sử dụng và mở rộng Eclipse.
  • Hãy tham gia vào các blog của developerWorks và tham gia vào cộng đồng developerWorks.

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=525134
ArticleTitle=Làm nhanh việc viết mã Java trong Eclipse Galileo
publish-date=09302010