Làm nhanh việc viết mã Java trong Eclipse Galileo Sử dụng bộ tạo mã toString() mới Nathan A. Good Kỹ sư trưởng, tư vấn Freelance Developer 30 09 2010 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™ . 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 { © Copyright IBM Corporation 2010 Làm nhanh việc viết mã Java trong Eclipse Galileo Nhẫn hiệu đăng ký Trang 1 của 12 developerWorks® ibm.com/developerWorks/vn/ 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. Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 2 của 12 ibm.com/developerWorks/vn/ developerWorks® Hình 1. Các lựa chọn của Java > Code 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. Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 3 của 12 developerWorks® ibm.com/developerWorks/vn/ Hình 2. 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. Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 4 của 12 ibm.com/developerWorks/vn/ developerWorks® Hình 3. 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: Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 5 của 12 developerWorks® ibm.com/developerWorks/vn/ 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 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. Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 6 của 12 ibm.com/developerWorks/vn/ developerWorks® 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. Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 7 của 12 developerWorks® ibm.com/developerWorks/vn/ Hình 5. 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() và equals() Sử dụng tạo mã hashCode() và 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. Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 8 của 12 ibm.com/developerWorks/vn/ developerWorks® 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ọ. Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 9 của 12 developerWorks® ibm.com/developerWorks/vn/ 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. Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 10 của 12 ibm.com/developerWorks/vn/ developerWorks® Tài nguyên Học tập • • • • • • • • • • • Hãy đọc cuốn "Sơ lược về Eclipse Galileo" để biết thêm thông tin về các tính năng của Galileo. Xem trang "Danh sách các bài nên đọc về Eclipse." Duyệt tất cả các nội dung về Eclipse trên developerWorks. Theo dõi trang developerWorks trên Twitter. Là người mới quen với Eclipse? Hãy đọc bài trên trang developerWorks "Hãy bắt đầu với các nền của Eclipse" để tìm hiểu nguồn gốc và kiến trúc của nó và cách mở rộng Eclipse với các trình cắm thêm. Mở rộng kĩ năng về Eclipse của bạn bằng cách xem các tài nguyên dự án Eclipse của IBM developerWorks. Để nghe các buổi phỏng vấn thú vị và các thảo luận cho những nhà phát triển phần mềm, hãy xem developerWorks podcasts. Hãy theo sát các sự kiện kỹ thuật và trang tin của developerWorks. Hãy xem và tìm hiểu về IBM và các công nghệ mã nguồn mở và chức năng sản phẩm với trình diễn theo yêu cầu miễn phí trên trang developerWorks. Xem các hội nghị sắp diễn ra, các triển lãm thương mại, các tin tức trên Web và các sự kiện trên khắp thế giới, là mối quan tâm của các nhà phát triển mã nguồn mở của IBM. Hãy thăm vùng mã nguồn mở của developerWorks để có thêm thông tin hướng dẫn, các công cụ và cập nhật dự án, nhằm giúp bạn phát triển với công nghệ mã nguồn mở và sử dụng chúng với các sản phẩm của IBM. Lấy sản phẩm và công nghệ • Hãy xem các mục tải được về công nghệ mới nhất của Eclipse tại trang alphaWorks của IBM. • Tải nền Eclipse và các dự án khác từ cơ sở Eclípse. • Tải các phiên bản đánh giá sản phẩm IBM hoặc khám phá những thử nghiệm trực tuyến trong SOA Sandbox và thử nghiệm các công cụ phát triển ứng dụng và các sản phẩm đệm của DB2®, Lotus®, Rational®, Tivoli® và WebSphere®. • Hãy đổi mới dự án phát triển mã nguồn mở tiếp theo của bạn với phần mềm dùng thử của IBM, đã sẵn cho phép tải về hoặc trên DVD. 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. Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 11 của 12 developerWorks® ibm.com/developerWorks/vn/ Đôi nét về tác giả Nathan A. Good 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ở © Copyright IBM Corporation 2010 (www.ibm.com/legal/copytrade.shtml) Nhẫn hiệu đăng ký (www.ibm.com/developerworks/vn/ibm/trademarks/) Làm nhanh việc viết mã Java trong Eclipse Galileo Trang 12 của 12