01/10/2018, 17:12

Nếu trong Class em viết như thế này thì sẽ có lỗi gì ạ

Em học trên mạng thì người ta khuyên viết constuctor theo kiểu chainning như này. Nhưng cho em hỏi là ở dòng

this(freeBags);

em không viết như thế thì nó sẽ gặp vấn đề gì trong chương trình mà người dạy khuyên không nên viết như thế ạ, đoạn code không nên viết em sẽ để ảnh ở dưới ạ

Trương Tấn Phát viết 19:21 ngày 01/10/2018

Viết như vậy dễ bị nhầm lẫn thôi chứ chẳng lỗi gì cả.
Tên trường (field) của lớp và tên tham trị giống nhau thì dùng this để phân biệt. Tuy vậy không nên để chúng giống nhau vì dễ gây nhầm, hoặc khi quên this sẽ dẫn đến sai.
Mình hay thêm dấu gạch dưới để nó khác nhau:

class Test{
boolean bol;
int number;
String str;

public Test(boolean _bol, int _number, String _str){
   bol = _bol;
   number = _number;
   str = _str;
// cũng giống với:
   this.bol = _bol;
   this.number = _number;
   this.str = _str;
}

}
locdt viết 19:15 ngày 01/10/2018

Về cơ bản để 2 constructor thế kia sẽ không tận dụng được khả năng tái sử dụng code. Lấy đơn giản 1 trường hợp cụ thể như này:

Như bình thường, như code của bạn, truyền freeBags vào constructor và không động chạm gì đến nó:

public Passenger(int freeBags) {
    this.freeBags = freeBags;
}

public Passenger(int freeBags, int checkedBags) {
    this.freeBags = freeBags;
    this.checkedBags = checkedBags;
}

Oke code này k có vấn đề gì cả, chạy bình thường luôn. Nhưng đến 1 lúc nào đó, bạn muốn truyền freeBags vào constructor nhưng đồng thời, muốn kiểm tra Passenger chỉ được phép mang tối đa 10 freeBags chẳng hạn. Bạn sẽ làm thế nào?

Ta có thể kiểm tra giá trị ở ngay trong constructor đúng không?

public Passenger(int freeBags) {
    if (freeBags > 10) {
        this.freeBags = 10;
    } else {
        this.freeBags = freeBags;
    }
}

Hay ho ở đây này. Với constructor thứ 2, bạn không tận dụng lại constructor đầu tiên, thì bạn sẽ phải lặp lại đoạn code kiểm tra số lượng freeBags.

public Passenger(int freeBags, int checkedBags) {
    if (freeBags > 10) {
        this.freeBags = 10;
    } else {
        this.freeBags = freeBags;
    }

    this.checkedBags = checkedBags;
}

Hay chỉ cần dùng this(freeBags) để tận dụng đoạn code của constructor thứ nhất:

public Passenger(int freeBags, int checkedBags) {
    this(freeBags);
    this.checkedBags = checkedBags;
}

Đây mới là với 2 constructor và code đơn giản, bạn thử hình dùng với 1 constructor xử lí phức tạp, và class của bạn có rất nhiều constructor, thì sẽ ra sao

Dù constructor đơn giản hay không, tốt nhất là cứ nên dùng this để đỡ phải code nhiều mà đảm bảo đc code k chạy sai.

Nguyen Ca viết 19:26 ngày 01/10/2018

ông này hiểu đúng này câu hỏi này.

Ga Mat Ong viết 19:24 ngày 01/10/2018

Em cám ơn ạ, anh hiểu đúng câu hỏi của em rồi ạ

Ga Mat Ong viết 19:15 ngày 01/10/2018

Không đúng ý câu hỏi của em nhưng em cũng cám ơn vì anh đã giúp ạ

Trương Tấn Phát viết 19:19 ngày 01/10/2018

Đọc không kĩ nên mình nhầm

Bài liên quan
0