01/10/2018, 16:03

Tại sao trong Java nên viết phương thức khởi tạo mặc định?

Mọi người cho mình hỏi tại sao trong java nên viết phương thức khởi tạo mặc định .Anh e cho mình ví dụ để hiểu ạ.Cảm ơn mọi người

Trần Hoàn viết 18:08 ngày 01/10/2018


Có thực sự là nên viết phương thức khởi tạo mặc định không? Nếu như không có nhu cầu quản lý giá trị mặc định thì không cần.

Aragami1408 viết 18:11 ngày 01/10/2018

Nói theo lý thuyết OOP, khi 1 object được reference từ một class, các thứ có trong phương thức khởi tạo sẽ được set mặc định cho object đó ngay từ khi khai báo. Mình sẽ lấy ví dụ với một số nguyên a. Có 2 đoạn code sau:

Có phương thức khởi tạo

public class WithCtor
{

    //cho số nguyên a và giá trị của nó là null
    public int a;
    //cú pháp của phương thức khởi tạo(<tên_class>()). Lúc này giá trị của a trong hàm này là 10
    WithCtor() 
    {
        a = 10;
    }

    //Phương thức cộng 1 số từ tham số của hàm vào a
    public int add(int number)
    {
        return a + number;
    }

    public int getA()
    {
        return a;
    }
}

Ko có phương thức khởi tạo:

public class WithoutCtor 
{

    //cho số nguyên a và giá trị của nó là null
    public int a;

    //Phương thức cộng 1 số từ tham số của hàm vào a
    public int add(int number)
    {
        return a + number;
    }

    public int getA()
    {
        return a;
    }
}

Rồi thêm entry point để chạy code:

public class Main 
{
    public static void main(String[] args)
    {
        WithCtor withCtor = new WithCtor() // WithCtor() chính là hàm khởi tạo đó!
        WithoutCtor withoutCtor = new WithoutCtor() // WithoutCtor() cũng là hàm khởi tạo nhưng không được khai bái vào gán giá trị
        withCtor.add(5); //Cộng 5 vào a của WithCtor
        withoutCtor.add(5); //Tương tự như trên
        System.out.println(withCtor.getA); //Output: 15 
        System.out.println(withoutCtor.getA); //Output: 5
    }
}

Theo như code trên 2 output hoàn toàn khác nhau mặc dù phương thức add() có cùng tham số mà a khi tạo ban đầu của cả 2 class đều là null(giá trị trống). Vì do class WithCtor có phương thức khởi tạo và trong đó set a bằng 10 tức là bao nhiêu object lấy từ nó ra đều có mặc định a = 10, trừ khi bạn đổi a bằng số nào đó khác trong phương thức khởi tạo của WithCtor.

Khái niệm này ban đầu mình cũng thấy khó hiểu, về sau thấy quen.

Bạn không bắt buộc sử dụng nó nhưng có thể dùng theo cách sau:

public class ViDu
{
    public int a, b, c;
    ViDu(int a, int b, int c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }
}

Cách này dùng ctor tiện hơn vì đỡ phải tạo các set method nhiều!

Nguyen Kien viết 18:09 ngày 01/10/2018

Tại vì để tránh các lỗi về khởi tạo dối tượng !!!

Phan Bá Hải viết 18:19 ngày 01/10/2018

Khi bạn viết một class không có constructor nào thì mặc định Java hiểu class đó có 1 constructor mặc định là constructor không tham số
VD

public class A {

    private String s;

    // Bạn không viết constructor nào, nhưng Java vẫn hiểu class có ctor không tham số
    public A() {}

    // getters and setters here

}

Nhưng nếu bạn viết một ctor có tham số thì Java sẽ bỏ qua ctor không tham số mặc định . Muốn có ctor không tham số bắt buộc bạn phải viết vào class

VD

public class A {

    private String s;

    // Bạn phải viết cả 2 ctor, không tham số và có tham số
    public A() {}
    public A(String s) {
        this.s = s;
    }

    // getters and setters here

}

Vì thế người ta khuyên dev phải viết ctor mặc định, tức ctor không tham số để tránh việc quên viết nó nếu bạn Overload ctor có tham số

Ctor không tham số giúp bạn tạo object ngay, sau đó gán giá trị sau (nhờ setters)

public A a = new A(); // Dùng ctor không tham số để tạo object


// Code xử lý lấy string
public String findString() {
    // Code here
    return s;
}

public String s = findString();

a.setS(s); // set s cho a
Văn Dương viết 18:08 ngày 01/10/2018

Mình nghĩ là cần thì viết, không cần thì thôi.
Có những cái khởi tạo chỉ constructor mới làm được thì tất nhiên bắt buộc phải viết. Còn không thì không cần phải vẽ hươu vẽ vượn làm gì.

Ví dụ:

class A{
    int X=0;
}

là xong.

Cần gì phải thế này:

class A{
    int X;
    public A(){
        X=0;
    }
}

Còn có những cái phải bắt buộc, ví dụ như

class A{
    int X= StaticMethod1();
    int Y= StaticMethod2();
    int Z=0;
    public A(){
        Z=X+Y;
    }
}
Nguyen Ca viết 18:18 ngày 01/10/2018

Em không viết thì khì khi complie nó tự thêm vào. em xem file .class sẽ thấy.

Bài liên quan
0