Загрузка одиночного файла с указанным загрузчиком классов в Eclipse - PullRequest
1 голос
/ 04 июля 2011

У меня небольшая проблема в моем проекте.Мы разрабатываем клиент для нашего сервера как плагин Eclipse.

Там у нас есть «ApplicationRegistry», который представляет собой всего лишь карту, которая содержит все объекты, которые нам нужны только один раз, но не должны быть одиночными.Эта ApplicationRegistry реализована как enum singleton и, помимо прочего, в другом плагине.Пока все работает отлично.

Теперь клиенту нужны разные «перспективы», которые демонстрируют немного другие функции.Это тоже не проблема.К настоящему времени у нас есть только два запускаемых объекта и два разных пункта меню для запуска двух разных классов, но нет проблем (и, вероятно, было бы лучше) разделить их на два или три плагина.

Теперь я перехожу кпроблема: мы можем использовать обе эти перспективы одновременно.Но ApplicationRegistry создается загрузчиком классов своего собственного плагина и поэтому существует один раз для всех наших перспектив.Поэтому, когда мы пытаемся открыть новую вкладку в первой перспективе, она открывается во второй.

Для краткого рассказа: плагины «parent1» и «parent2» используют синглтон в плагине «child» ивлияют друг на друга нежелательным образом.Моя идея состоит в том, чтобы загрузить синглтон в каждом из родительских плагинов с их собственным загрузчиком классов.Но так как я понятия не имею, как загрузить синглтон перечисления с указанным загрузчиком классов, я не могу проверить, будет ли это решение делать.

Кто-нибудь может мне сказать, как загрузить синглтон перечисления с указанным загрузчиком классов (и еслиправильная ApplicationRegistry будет указана далее в каждом плагине), если это может сработать или если есть другое решение, которое не требует огромной реинжиниринга во всем проекте?

Спасибо, Себастьян

1 Ответ

1 голос
/ 04 июля 2011

Не загружайте одно и то же перечисление несколькими загрузчиками классов. Вы попадете в ад за это (ад ошибки ошибки времени, то есть). Хотя enum singletons / multitons отлично подходят для простых задач, они просто не масштабируются для подобных целей. Два возможных решения

a) Используйте одно перечисление на перспективу (т. Е. Перспектива должна «знать», какое перечисление искать

б) Дайте элементам перечисления «знать», к какой перспективе они принадлежат (используйте второе перечисление для ваших перспектив):

public enum Perspective{
    A, B, C
}

public enum Thing{

    FOO(Perspective.A, Perspective.B),
    BAR(Perspective.C),
    BAZ(Perspective.A, Perspective.B, Perspective.C),
    ;
    private final Perspective[] perspectives;
    private Thing(Perspective ... perspectives){
      this.perspectives=perspectives;
    }

    public static Set<Thing> forPerspective(Perspective p){
        Set<Perspective> set = EnumSet.noneOf(Perspective.class);
        for(Thing t : values()){
            if(EnumSet.of(t.perspectives).contains(p)){set.add(t);}
        }
        return t;
    }
}
...