Введите безопасный enum для внедрения зависимостей - PullRequest
4 голосов
/ 30 марта 2012

Я хотел простой способ для не кодировщиков отображать новые «тесты» с типами «тест» с наименьшим количеством изменений кода, используя Guice для внедрения зависимостей.Мне нравится простота, но не очевидное отсутствие безопасности типов.Любые предложения, чтобы сделать это лучше?

public enum TestType {

    TEST_TYPE_1("TEST-1", Test1.class), 
    TEST_TYPE_2("TEST-2", Test2.class), 
    TEST_TYPE_3("TEST-3", Test3.class), 
    TEST_TYPE_4("TEST-4", Test4.class), 
    TEST_TYPE_5("TEST-5", Test5.class);

    private final String testType;
    private final Class<TestIF> tester;

    private <TestIF> TestType(String testType, Class<TestIF> tester)    {       
        this.testType = testType;
        this.tester = (Class<tester.TestIF>) tester;
    }

    public String toString() {
        return this.testType;
    }

    public Class<TestIF> tester() {
        return this.tester;
    }
}

"Тест" будет создан следующим образом:

TestIF tester = Guice.createInjector().getInstance(testType.tester());    
tester.execute();

1 Ответ

0 голосов
/ 02 апреля 2012

Это помогает заставить Test'ы реализовывать TestIF, что в данном случае немного безопаснее.

public enum TestType {

TEST_TYPE_1("TEST-1", Test1.class), 
TEST_TYPE_2("TEST-2", Test2.class), 
TEST_TYPE_3("TEST-3", Test3.class), 
TEST_TYPE_4("TEST-4", Test4.class), 
TEST_TYPE_5("TEST-5", Test5.class);

private final String testType;
private final Class<? extends TestIF> tester;

private <T extends TestIF> TestType(String testType, Class<? extends TestIF> tester)    {       
    this.testType = testType;
    this.tester = (Class<tester.TestIF>) tester;
}

public String toString() {
    return this.testType;
}

public Class<? extends TestIF> tester() {
    return this.tester;
}
...