Tôi đang cố gắng tạo ra một mẫu xây dựng sử dụng Generics để cung cấp kiểm tra kiểu trên một số phương pháp. Hiện nay tôi có làm việc tiếp theo:Loại Generic Từ Enum & The Builder Pattern
ParameterBuilder.start(String.class).setName("foo").setDefaultValue("Hello").build();
ParameterBuilder.start(Integer.class).setName(bar).setDefaultValue(42).build();
ParameterBuilder.start(Boolean.class).setName(bar).setDefaultValue(false).build();
Sử dụng mã:
public class ParameterBuilder<T> {
private String name;
private T defaultValue;
public static <T2> ParameterBuilder<T2> start(Class<T2> type) {
return new ParameterBuilder<T2>();
}
// Other methods excluded for example
}
Vì vậy, các loại đầu vào cho phương pháp setDefaultValue
được xác định bởi những gì đang được truyền vào phương pháp start
, cũng giống như tôi muốn.
Nhưng giờ tôi muốn mở rộng nội dung được chuyển vào start()
để chứa thêm một chút thông tin. Về cơ bản tôi muốn vượt qua trong một "loại" cho các thông số tôi tạo ra. Đôi khi các thông số này sẽ là những thứ như "email", "url" vv Giá trị mặc định sẽ vẫn thuộc loại đã biết (Chuỗi trong các trường hợp đó), vì vậy tôi muốn có một cái gì đó như:
ParameterBuilder.start(EMAIL).setName("email").setDefaultValue("[email protected]").build();
ParameterBuilder.start(URL).setName("website").setDefaultValue("http://www.somewhere.com").build();
Tại thời điểm này, EMAIL & URL là enums, chứa các thứ khác - lớp của giá trị mặc định. Nhưng nếu tôi đi xuống con đường này, làm thế nào tôi có thể khởi tạo trình tạo tham số?
public static <T2> ParameterBuilder<T2> start(ParameterType paramType) {
Class<T2> type = paramType.getTypeClass();
// How do I instantiate my ParameterBuilder with the right type?
}
Nếu không thể thực hiện bằng enums (tôi có thể thấy trường hợp này), có ai có đề xuất giải pháp khác không?
Bạn có thể hiển thị những gì chính xác là 'EMAIL', 'URL'. Họ là 2 enums khác nhau? Họ có phải là trường hợp của hai enums? Họ là ai? –
Trong trường hợp của tôi, tôi đã có một ParameterType lặp lại một cái gì đó như: 'public enum ParameterType {STRING (String.class," String "), INTEGER (Integer.class," Integer "), MULTILINE (String.class," Multine Text "), HTML (String.class, "HTML"), DATE (Date.class, "Date"), BOOLEAN (Boolean.class, "Boolean"); // Phương thức được theo dõi là ' –