2013-08-07 40 views
5

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?

+1

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? –

+0

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à ' –

Trả lời

2

Tôi nghĩ rằng bạn cần một loại enum cho mỗi loại (tôi không thấy cách bạn có thể có một enum bao gồm một số loại và giữ cho mọi thứ hoạt động). Trong trường hợp đó, một giao diện chung chung có thể làm những gì bạn muốn. Sau đó, bạn có thể tạo một số loại nhà máy để cung cấp hằng số enum nếu điều đó có ích.

này biên dịch:

static interface ParameterType<T> {} 

static enum ParameterTypeEnum implements ParameterType<String> { EMAIL; } 

public static void main(String[] args) { 
    ParameterBuilder 
      .start(ParameterTypeEnum.EMAIL) 
      .setName("email") 
      .setDefaultValue("[email protected]") 
      .build(); 
} 

public static class ParameterBuilder<T> { 

    private String name; 
    private T defaultValue; 

    public static <T2> ParameterBuilder<T2> start(ParameterType<T2> paramType) { 
     return new ParameterBuilder<T2>(); 
    } 

    ParameterBuilder<T> setName(String name) { 
     this.name = name; 
     return this; 
    } 

    ParameterBuilder<T> setDefaultValue(T defaultValue) { 
     this.defaultValue = defaultValue; 
     return this; 
    } 

    void build() {} 
} 
+0

Nghe có vẻ giống như một cách hợp lý để thực hiện nó. Bằng cách này tôi có thể có StringParameterEnum, IntegerParameterEnum vv mà vẫn sẽ để lại mã khá sạch sẽ. Cảm ơn –

0

Tôi không chắc chắn bối cảnh trong những gì bạn muốn sử dụng điều này, nhưng tôi nghĩ rằng sau đây có thể là một tùy chọn.

Bạn có thể thực hiện theo nguyên tắc Mở/Đóng và tạo giao diện Parameter và có một triển khai cho mỗi loại. Lợi ích của điều này, là bạn không cần phải thêm một giá trị enum mới cho mỗi Thông số mới mà bạn muốn. Sau đó bạn có thể vượt qua lớp học để ParameterBuilder thay vì enum và ParameterBuilderParameter sẽ làm việc cùng nhau để xây dựng những gì bạn cần.

Vì vậy, ParameterBuilder.start() có thể trả về một phiên bản cụ thể của Parameter cụ thể và thông số có thể có các phương pháp khác nhau tùy thuộc vào loại thông số.

Tôi không nghĩ câu trả lời này thực sự tốt, nhưng hy vọng có thể cung cấp cho bạn một gợi ý về cách xây dựng một giải pháp tiềm năng cho bối cảnh của bạn.

0

Bạn có thể tạo một hierachie đối tượng cho các Email và Url loại

public class DefaultType { 
    protected String name; 
    protected String defaultValue; 
    //some constructor 
} 

public class EmailType extends DefaultType { 
    ... 
} 

public class URLType extends DefaultType { 
    ... 
} 

thì người xây dựng tham số có thể giống như thế này:

public static ParameterBuilder start(DefaultType type) { 
    ParameterBuilder builder = new ParameterBuilder(type); 
    builder.setType(type); 
    return builder; 
} 

Sau đó, bạn có thể gọi nó như thế này:

ParameterBuilder.start(new EmailType("name","value");... 

điều này có giúp ích hay không bạn muốn đi theo hướng này?

Các vấn đề liên quan