Có các hàm trợ giúp tĩnh để tạo đối số hàm tạo là một giải pháp hoàn toàn lành mạnh, nhưng các hàm này bị giới hạn trong các hoạt động mà chúng có thể thực hiện do chúng phải tạo chính xác một đối số và không thể giao tiếp với nhau.
Trong trường hợp chung nhất mà bạn muốn điều chỉnh một giao diện Constructor(A, B, C)
thành một giao diện có thể sử dụng nhiều hơn Constructor(X, Y)
, bạn có thể định nghĩa một hàm tạo của trình trợ giúp riêng có một riêng ArgumentObject
và các chuỗi cho hàm tạo hiện có. Hàm xây dựng có thể sử dụng nhiều hơn sau đó xâu chuỗi với hàm tạo của trình trợ giúp thông qua hàm trợ giúp tĩnh để tạo đối tượng đối số:
class Constructor {
// constructor you want to wrap
public Constructor(A a, B b, C c) { ... }
// better constructor you are defining
public Constructor(X x, Y y) { this(createArgumentObject(x, y)); }
// helper constructor using an ArgumentObject
private Constructor(ArgumentObject ao) { this(ao.a, ao.b, ao.c); }
// helper to create the argument object
private static ArgumentObject createArgumentObject(X x, Y y) { ... }
private static class ArgumentObject { ... }
}
Trong các ngôn ngữ không có chuỗi hàm tạo trong cùng một lớp (chẳng hạn như C ++ 03), bạn sẽ phải xác định một lớp con trung gian cho hàm tạo của trình trợ giúp.
Tuy nhiên, kỹ thuật này chỉ đơn thuần là sự khái quát hóa việc sử dụng các hàm tĩnh của bạn trong các đối số của hàm tạo. Các giải pháp khác mà bạn đã đề xuất có nhiều nhược điểm khác nhau, đó là lý do tại sao tôi sẽ tránh chúng trừ khi có một lý do rất chính đáng để thích chúng:
thực hiện các nhà xây dựng tốt cần rất nhiều nỗ lực cho rất ít giá trị. Nếu hàm tạo mới đủ đơn giản, bạn có thể làm mà không cần trình xây dựng. Giả sử lớp bạn đang gói thực hiện xác nhận hợp lệ, bạn có thể đặt đối tượng đối số ở chế độ công khai để các đối số có thể được truyền bằng cách sử dụng Constructor(new Constructor.Arguments {{ foo = 42; bar = baz; }})
thành ngữ.
sử dụng các biến tĩnh được tính toán trong khối khởi tạo tĩnh có ý nghĩa đối với dữ liệu thực sự tĩnh, nhưng phải cẩn thận để tránh trạng thái toàn cầu. Trừ khi việc khởi tạo rất đơn giản, bạn nên sử dụng các hàm tĩnh để khởi tạo các biến này để việc khởi tạo có thể kiểm tra được. Bây giờ, lợi thế duy nhất so với trực tiếp sử dụng các phương thức tĩnh là các giá trị chỉ được tính một lần và được sử dụng lại cho tất cả các khởi tạo.
Vì câu hỏi của bạn cho thấy các khởi tạo này có thể phức tạp hơn, nên việc sử dụng các khối khởi tạo tĩnh là một điều không nên nếu việc kiểm tra là quan trọng đối với bạn. (Nếu không, bạn có nhiều vấn đề khẩn cấp hơn.)