Archive for August, 2010

Kỹ Thuật Lập Trình Hướng Đối Tượng – Phần 4

3.Định nghĩa phương thức equals với các trường(field) có thể sữa đổi

Ta xây dựng lại lớp Point như sau:

public class Point { 

    private int x;
    private int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
  Read more…

Kỹ Thuật Lập Trình Hướng Đối Tượng – Phần 3

2.Thay đổi equals mà không thay đổi hashcode

Trong ví dụ trên, tại sao sau khi viết lại phương thức equals, sử dụng phương thức contrains của HashSet vẫn cho kết quả false. Đó là bởi vì bạn chỉ ghi đè lại phương thức equals mà không ghi đè phương thức hashCode.

Lưu ý rằng, các lớp trong collection thường lưu địa chỉ của các phần tử của nó bằng các mã băm(hash code) để giúp cho việc tìm kiếm hay sắp xếp nhanh hơn. Collection trong ví dụ trên là HashSet. Điều này có nghĩa rằng các thành phần của collection được đặt trong các đoạn băm(hash buckets) để xác định các giá trị hash code của chúng. Phương thức contains đầu tiên xác định một hash bucket để tìm kiếm và sau đó so sánh với các phần tử đã cho với tất cả các phần tử trong bucket đó. Trong ví dụ trên, bạn đã ghi đè phương thức equals nhưng không ghi đè phương thức hashCode, cho nên hashCode vẫn chứa các giá trị được lưu trong lớp cha của nó là Object. Điều này dẫn đến các hash code của p1 và p2 khác nhau mặc dù các trường của nó có giá trị giống nhau. Các hash code khác nhau có nghĩa các hash bucket khác nhau trong tập hợp, điều này có nghĩa là p1 và p2 nằm trong các bucket khác nhau và cho kết quả false.

Như vậy, vấn đề ở đây là việc thực hiện cuối cùng của Point vi pham quy tắc(contact) hashCode được định nghĩa trong Object:

Nếu hai đối tượng được gọi là bằng nhau theo phương thức equals, sau đó gọi phương thức hashCode trên mỗi đối tượng đó đều phải trả về kết quả cùng một số nguyên.

Như vậy, ta xây dựng lại lớp Point như sau: Read more…

Kỹ Thuật Lập Trình Hướng Đối Tượng – Phần 2

II.Phương thức Equals() trong Java

Trong bài trước, chúng ta đã tìm hiểu về phương thức toString() trong lớp Object. Tiếp theo, trong bài viết này sẽ mô tả một kỹ thuật để ghi đè phương thức equals() trong Java có hiệu quả.

Các pitfalls chung trong phương thức equals()

  • Định nghĩa equals() với signature sai.
  • Thay đổi equals mà không thay đổi hashcode.
  • Định nghĩa equals với các trường có thể thay đổi.
  • Không xác định equals như là một mối quan hệ tương đương.

1.Định nghĩa equals với signature sai

Xét ví dụ: Xây dựng lớp Point với 2 trường x,y kiểu nguyên, xây dựng 2 phương thức getX(), getY() để lấy giá trị của chúng, sau đó override phương thức equals().

public class Point {
  Read more…

Làm Việc Với Xml Trên Android – Phần 2

Phân tích SAX dễ dàng hơn

Android SDK có chứa một lớp tiện ích được gọi là android.util.Xml. Ví dụ 7 trình bày cách cài đặt một trình phân tích SAX với cùng lớp tiện ích như thế.
Ví dụ 7. Trình phân tích SAX Android

public class AndroidSaxFeedParser extends BaseFeedParser {

public AndroidSaxFeedParser(String feedUrl) {

super(feedUrl);

}

public List<Message> parse() {

RssHandler handler = new RssHandler();

try {

Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, handler);

} catch (Exception e) {

throw new RuntimeException(e);

}

return handler.getMessages();

}

}

Lưu ý là lớp này vẫn sử dụng trình xử lý SAX chuẩn, vì đơn giản bạn đã sử dụng lại RssHandler như trong ví dụ 7 ở trên. Việc có thể sử dụng lại trình xử lý SAX rất tốt, nhưng nó vẫn có đôi chút phức tạp về mã trình. Bạn có tưởng tượng, nếu bạn phải phân tích một tài liệu XML phức tạp hơn rất nhiều, trình phân tích có thể trở thành mảnh đất màu mỡ cho các lỗi. Ví dụ, hãy xem lại phương thức endElement trong ví dụ 6. Lưu ý cách phương thức này kiểm tra như thế nào nếu currentMessage có giá trị không trước khi nó cố cài đặt các thuộc tính? Bây giờ hãy nhìn vào XML mẫu trong ví dụ 4. Lưu ý rằng có các thẻ TITLE và LINK nằm ngoài các thẻ ITEM. Đó là lý do tại sao kiểm tra giá trị không được đưa vào. Nếu không thì thẻ TITLE đầu tiên có thể gây ra một NullPointerException. Android bao gồm cả biến thể SAX API của chính nó (xem ví dụ 8) loại bỏ yêu cầu bạn phải viết trình xử lý SAX của chính bạn.
Ví dụ 8. Trình phân tích SAX Android đơn giản Read more…

Làm việc với XML trên Android – Phần 1

Giới thiệu

Android là một hệ điều hành nguồn mở, hiện đại và là SDK cho các thiết bị di động. Với hệ điều hành này, bạn có thể tạo ra các ứng dụng di động rất mạnh. Điều này thậm chí còn trở nên hấp dẫn hơn nữa khi các ứng dụng của bạn có thể truy cập các dịch vụ Web, có nghĩa là bạn cần sử dụng ngôn ngữ của Web là: XML. Trong bài viết này, bạn sẽ thấy nhiều lựa chọn khác nhau để làm việc với XML trên Android và cách sử dụng chúng để xây dựng các ứng dụng Android của chính bạn.

Bắt đầu

Trong bài viết này, bạn học cách xây dựng các ứng dụng Android có thể làm việc với XML từ Internet. Các ứng dụng Android được viết bằng ngôn ngữ lập trình Java™, do vậy mà kinh nghiệm làm việc với công nghệ Java là điều cần phải có. Để phát triển cho Android, bạn sẽ cần đến Android SDK. Toàn bộ mã trình được trình bày trong bài viết này sẽ làm việc với bất kỳ phiên bản nào của Android SDK, nhưng phiên bản SDK 1.5_pre đã được sử dụng để phát triển mã trình. Bạn có thể phát triển các ứng dụng Android chỉ với SDK và một trình biên tập văn bản là đủ, nhưng sẽ dễ dàng hơn nhiều nếu sử dụng Android Developer Tools (ADT), là một trình bổ sung Eclipse. Đối với bài viết này, phiên bản 0.9 của ADT đã được dùng với Eclipse 3.4.2, một phiên bản Java.

XML trên Android

Nền tảng Android là một nền tảng phát triển di động mã nguồn mở. Nó giúp bạn truy cập vào tất cả các khía cạnh của thiết bị di động mà nó chạy trên đó, từ các đồ họa cấp thấp, đến phần cứng như là thiết bị camera trên điện thoại. Với rất nhiều thứ có thể sử dụng Android, có thể bạn sẽ tự hỏi tại sao bạn cần phiền đến XML. Đó không phải vì làm việc với XML rất thú vị; mà là nó đang làm việc với những thứ mà nó kích hoạt. XML thường được dùng như là một định dạng dữ liệu trên Internet. Nếu bạn muốn truy cập dữ liệu từ Internet, các khả năng có thể là dữ liệu sẽ ở dạng XML. Nếu bạn muốn gửi dữ liệu đến một dịch vụ Web, có thể bạn cũng cần gửi cả dữ liệu XML. Nói ngắn gọn là nếu ứng dụng Android của bạn thúc đẩy Internet, thì có thể bạn sẽ cần phải làm việc với XML. Thật may mắn là bạn có rất nhiều lựa chọn có sẵn để làm việc với XML trên Android.

Các trình phân tích XML

Một trong nhữn ưu điểm lớn nhất của nền tảng Android chính là việc nó thúc đẩy ngôn ngữ lập trình Java. Android SDK không hoàn toàn cung cấp sẵn mọi thứ cho Môi trường Thời gian chạy Java (JRE) chuẩn của bạn, nhưng nó lại hỗ trợ một phần rất đáng kể cho nó. Nền tảng Java đã và đang hỗ trợ rất nhiều cách khác nhau để làm việc với XML trong thời gian nhất định, và hầu hết các API có liên quan đến XML của Java đều được hỗ trợ đầy đủ trên Android. Ví dụ, Simple API của Java cho XML (SAX) và Document Object Model (DOM) hiện đều có sẵn trên Android. Nhiều năm qua, cả hai API này là một phần của công nghệ Java. Sản phẩm Streaming API mới đây cho XML (StAX) hiện chưa có trong Android. Tuy nhiên, Android lại cung cấp một thư viện tương đương về mặt chức năng. Điều cuối cùng là Java XML Binding API cũng không có sẵn trong Android. Chắc chắn có thể thực hiện API này trong Android. Tuy nhiên, nó lại có xu hướng là một API nặng ký, với rất nhiều thể hiện khác nhau thuộc các lớp khác nhau thường cần việc trình bày một tài liệu XML. Do vậy mà nó không lý tưởng lắm cho một môi trường bị ràng buộc chẳng hạn như thiết bị cầm tay mà Android được thiết kế để chạy trên đó. Trong các phần tiếp theo, bạn sẽ lấy một nguồn XML đơn giản có sẵn trên Internet, và xem cách phân tích nguồn đó như thế nào trong phạm vi một ứng dụng Android sử dụng các API khác nhau được nhắc đến ở trên.Trước tiên, hãy xem các phần cần thiết của ứng dụng đơn giản sẽ sử dụng XML từ Internet. Read more…

Xử Lý Ngoại Lệ Trong Java

Ngoại lệ trong Java là các đối tượng có kiểu lớp định nghĩa sẵn, biểu diễn trạng thái lỗi tự động phát sinh trong trường hợp nào đó khi một hàm được thực hiện. Các hàm trong Java được định nghĩa sẵn trong trường hợp nào thì có kiểu ngoại lệ nào đó sẽ phát sinh. Khi một ngoại lệ nảy sinh, có thể lựa chọn hai khả năng xử lý: bắt lỗi hay cho qua.

Lệnh xử lý ngoại lệ thực hiện thông qua năm từ khoá : try, catch, finally, throw và throws

1. Lệnh try…catch…finally

pháp: try {

Statement;

} catch (Exception-Type1Name1) {

Statement1;

}catch (Exception-Type-2Name2) {

Statement2;

}

finally {

Statementn+1;

}

Statement : có thể là một hay nhiều lệnh đơn, hay cấu trúc điều khiển.

Ý nghĩa:

try : định nghĩa một khối lệnh mà ngoại lệ có thể xảy ra.

catch : đi kèm với try, để bắt ngoại lệ. Những câu lệnh trong chương trình mà bạn muốn bắt ngoại lệ được đưa vào giữa khối try, nếu một ngoại lệ xảy ra trong khối try, thân của mệnh đề catch có kiểu ngoại lệ tương ứng sẽ được thực hiện. Có thể có nhiều mệnh đề catch bắt các kiểu ngoại lệ khác nhau.

finally : thân của mệnh đề finally luôn luôn thực hiện trước khi lệnh try kết thúc, cho dù có hay không có ngoại lệ, mệnh đề finally có thể có hay không. Read more…

Exception Trong Java

I. Khái niệm về xử lý ngoại lệ

  • Mọi đoạn chương trình đều tiềm ẩn khả năng sinh lỗi.
    • lỗichủ quan: do lập trình sai.
    • lỗi khách quan: do dữ liệu, do trạng thái của hệ thống.
    • Ngoại lệ: các trường hợp hoạt động không bình thường.
    • Xử lý ngoại lệ như thế nào.
      • làm thế nào để có thể tiếp tục (tái) thực hiện.

Cách xử lý lỗi truyền thống

  • Cài đặt mã xử lý tại nơi phát sinh ra lỗi.
    • làm cho chương trình trở nên khó hiểu.
    • không phải lúc nào cũng đầy đủ thông tin để xử lý.
    • không nhất thiết phải xử lý.
    • „ Truyền trạng thái lên mức trên.
      • thông qua tham số, giá trị trả lại hoặc biến tổng thể (flag).
      • dễ nhầm.
      • vẫn còn khó hiểu.
      • Khó kiểm soát được hết các trường hợp.
        • lỗi số học, lỗi bộ nhớ,…
        • Lập trình viên thường quên không xử lý lỗi.
          • bản chất con người.
          • thiếu kinh nghiệm, cố tình bỏ qua. Read more…

Thuật Toán Sắp Xếp – Phần 1

Trong khoa học máy tính và trong toán học, một thuật toán sắp xếp là một thuật toán sắp xếp các phần tử của một danh sách (hoặc một mảng theo thứ tự (tăng hoặc giảm)). Người ta thường xét trường hợp các phần tử cần sắp xếp là các số.

Bài toán sắp xếp đã được nhiều nhà khoa học quan tâm.

I.Phân loại thuật toán sắp xếp

1.Sắp xếp ổn định

Một thuật toán sắp xếp được gọi là sắp xếp ổn định nếu sau khi tiến hành sắp xếp vị trí tương đối giữa các phần tử bằng nhau không bị thay đổi.

2.Săp xếp so sánh

Một thuật toán sắp xếp được gọi là sắp xếp so sánh nếu trong quá trình thực hiện thuật toán ta tiến hành so sánh các khoá và đổi chỗ các phần tử cho nhau. Đa số các thuật toán sắp xếp dưới đây là sắp xếp so sánh, riêng sắp xếp đếm phân phối không phải là sắp xếp so sánh.

II.Một số thuật toán sắp xếp

1.Sắp xếp nổi bọt

Sắp xếp nổi bọt (bubble sort) là phương pháp sắp xếp đơn giản, dễ hiểu thường được dạy trong khoa học máy tính. Giải thuật bắt đầu từ đầu của tập dữ liệu. Nó so sánh hai phần tử đầu, nếu phần tử đứng trước lớn hơn phần tử đứng sau thì đổi chỗ chúng cho nhau. Tiếp tục làm như vậy với cặp phần tử tiếp theo cho đến cuối tập hợp dữ liệu. Sau đó nó quay lại với hai phần tử đầu cho đến khi không còn cần phải đổi chỗ nữa.

2.Sắp xếp chèn

Sắp xếp chèn (insertion sort) là một thuật toán sắp xếp rất hiệu quả với các danh sách nhỏ. Nó lần lượt lấy các phần tử của danh sách chèn vào vị trí thích hợp trong một danh sách mới đã được sắp. Read more…

Thuật toán

Thuật toán , còn gọi là giải thuật, là một tập hợp hữu hạn của các chỉ thị hay phương cách được định nghĩa rõ ràng cho việc hoàn tất một số sự việc từ một trạng thái ban đầu cho trước; khi các chỉ thị này được áp dụng triệt để thì sẽ dẫn đến kết quả sau cùng như đã dự đoán.

Nói cách khác, thuật toán là một bộ các qui tắc hay qui trình cụ thể nhằm giải quyết một vấn đề trong một số bước hữu hạn, hoặc nhằm cung cấp một kết quả từ một tập hợp của các dữ kiện đưa vào.

Ví dụ: thuật toán để giải phương trình bậc nhất P(x): ax + b = c, (a, b, c là các số thực), trong tập hợp các số thực có thể là một bộ các bước sau đây:

  1. Nếu a = 1
    • b = c thì P(x) có nghiệm bất kì
    • bc thì P(c) vô nghiệm
  2. Nếu a ≠ 0
    • P(x) có duy nhất một nghiệm x = (cb)/a Read more…

Kỹ Thuật Lập Trình Hướng Đối Tượng – Phần 1

Mặc dù Object là một lớp cụ thể, nó được thiết kế chủ yếu để các lớp các kế thừa. Tất cả các phương thức non-final của nó (equals(), hashCode(), toString(), clone(), và finalize()) đều có các quy tắc chung bởi vì chúng được thiết kế để được overrride. Tất cả các lớp kế thừa từ Object mà overrride các phương thức này đều phải tuân theo các quy tắc chung của chúng.

I.Override phương thức toString()

1.Đặt vấn đề:

Bạn có một định dạng mặc định hữu ích.

2.Giải pháp

Override phương thức toString() kế thừa từ java.lang.Object.

3.Lý giải

Khi bạn gán một đối tượng vào phương thức System.out.println() hoặc bất kỳ phương thức nào tương đương, Java sẽ tự động gọi phương thức toString(). Bởi vì tất cả các lớp trong Java đều có một lớp cha cao nhất là java.lang.Object, và cài đặt mặc định của phương thức toString() trong lớp java.lang.Object là: tên lớp, ký tự @ và giá trị hascode của đối tượng.

Ví dụ

/* Demonstrate toString( ) without an override */

public class ToStringWithout {

int x, y;

/** Simple constructor */

public ToStringWithout(int anX, int aY) {

x = anX; y = aY;

} Read more…