newInstance()
thường được sử dụng như một cách để tạo một đối tượng mà không cần trực tiếp gọi constructor mặc định của đối tượng. Ví dụ, nó thường được sử dụng để thực hiện một thiết kế mẫu Singleton:
public class Singleton {
private static final Singleton instance = null;
// make the class private to prevent direct instantiation.
// this forces clients to call newInstance(), which will
// ensure the class' Singleton property.
private Singleton() { }
public static Singleton newInstance() {
// if instance is null, then instantiate the object by calling
// the default constructor (this is ok since we are calling it from
// within the class)
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Trong trường hợp này, các lập trình viên buộc khách hàng để gọi newInstance()
để lấy một thể hiện của lớp. Điều này quan trọng bởi vì chỉ đơn giản là cung cấp một hàm tạo mặc định sẽ cho phép máy khách truy cập vào nhiều phiên bản của lớp (mà đi ngược lại thuộc tính Singleton).
Trong trường hợp Fragment
s, việc cung cấp phương pháp nhà máy tĩnh newInstance()
là thực tiễn tốt vì chúng tôi thường muốn thêm đối số khởi tạo cho đối tượng mới được tạo. Thay vì yêu cầu trình khách gọi hàm tạo mặc định và tự đặt chính các tham số đoạn, chúng tôi có thể cung cấp phương thức newInstance()
thực hiện điều này cho chúng. Ví dụ,
public static MyFragment newInstance(int index) {
MyFragment f = new MyFragment();
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
Nhìn chung, trong khi chênh lệch giữa hai chủ yếu là chỉ là vấn đề thiết kế, sự khác biệt này là thực sự quan trọng vì nó cung cấp một mức độ trừu tượng và làm cho mã dễ dàng hơn rất nhiều để hiểu được.
Nguồn
2012-01-17 04:03:54
Thông thường, A.newInstance được sử dụng cho mẫu thiết kế singleton. –