Java tạo ra một hàm tạo không tham số khi bạn không có bất kỳ hàm nào khác giống như một người phục vụ lịch sự lấy áo khoác cho bạn.
Java vẫn tạo ra một hàm tạo không tham số sau khi bạn định nghĩa một phiên bản khác của nó giống như người phục vụ cởi áo khoác cho bạn sau khi bạn đưa ra một dấu hiệu rõ ràng rằng bạn có kế hoạch riêng của mình về việc phải làm gì với lớp phủ.
Nếu tôi có một lớp học (mà tôi muốn trở thành bất biến):
class Person
{
final String firstName;
final String lastName;
Và tôi thêm một hàm tạo:
Person(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
Và Java vẫn cung cấp một hàm tạo không tham số mặc định, sau đó mã này không thể biên dịch được, bởi vì firstName
và lastName
các trường được khai báo là cuối cùng, nhưng chúng không được đặt sau khi bạn gọi Person p = new Person()
.
Bạn đang buộc tôi cung cấp một triển khai khác:
private Person()
{
this.firstName = null; // or "", or whatever
this.lastName = null;
}
Và vì tôi không muốn nó - vì nó vô dụng, tôi có thể cảm thấy có xu hướng đặt hộp sọ và xương chéo lên nó:
@Deprecated
private Person()
{
// don't use this constructor! i don't want it to ever be called!
throw new RuntimeException("Illegal constructor called");
}
Nhưng tôi vẫn không thể cấm một nhà phát triển khác tạo một phương thức (bên trong Person
lớp, vì vậy việc đánh dấu hàm tạo là riêng tư không giúp ích gì):
public static Person createPerson()
{
return new Person(); // this will blow in our face
}
Tất cả sự phiền phức này có thể - và - được tránh nhờ vào việc Java (và không chỉ Java) hoạt động theo cách nó hoạt động.
Nếu bạn xác định một phương thức setCoordinates(int x, int y)
, bạn không mong muốn trình biên dịch tự động chấp nhận một phiên bản không tham số của phương thức đó - setCoordinates()
. Nó sẽ không làm một điều gì.
Làm thế nào khác với mong đợi một nhà xây dựng không tham số? Chà, rõ ràng, một nhà xây dựng luôn làm ít nhất một điều - nó tạo ra một đối tượng (hoặc chết khi cố gắng).
Nhưng tôi thích được kiểm soát cách tôi muốn các đối tượng của mình được khởi tạo. Buộc tôi phải có một hàm tạo không tham số cho dù tôi có làm gì đi điều khiển này khỏi tôi.