2016-11-03 2 views
4

Прямо сейчас у меня есть два Enum s, которые должны иметь только синхронизированные значения, и они присутствуют в отдельных проектах. Мне нужно найти способ захватить значения из одного enum (Enum1) и импортировать их в (Enum2).Импорт значений из одного Enum в другой?

Enum1.java Что выглядит следующим образом:

package com.example.hello; 

import com.example.foo.SomeClass; 

public enum Enum1 { 
    A(1), B(2), C(3), D(4); 

    integer i; 

    Enum1(int ii) { 
     this.i = ii; 
    } 

    public static int getValue(Enum1 e) { 
     return e.i; 
    } 

    public int doSomething() { 
     return SomeClass.doThings(i); 
    } 
} 

Между тем, Enum2.java (в другом проекте) в настоящее время выглядит следующим образом:

package com.example.world; 

import com.example.bar.SomeOtherClass; 

import static com.example.hello.Enum1.*; 

public enum Enum2 { 
    // Enums *should* be imported from Enum1 

    integer i; 

    Enum2(int ii) { 
     this.i = ii; 
    } 

    public int doSomethingElse() { 
     return SomeOtherClass.doSomethingElse(i); 
    } 
} 

Конечно, это не работает, потому что значения не переносятся через промежуток.

Те же рассуждения должны были бы использовать Enum1 в моем коде, но функции в Enums между двумя проектами должны быть совершенно разными.

Является ли то, что я пытаюсь сделать, даже возможно? Если да, то как я могу это сделать (относительно разумно)?


Для контекста эти две программы используют эти перечисления для модели разрешения. Система проверяет, находится ли пользователь на уровне или выше минимально необходимого уровня разрешений, который может быть чем-то вроде Enum1.B. Проблема в том, что Enum1 зависит от класса, который я не могу импортировать в проект, который содержит Enum2, потому что это было бы полным отходом, чтобы связать зависимость Java с проектом Enum2, особенно если этот проект никогда не будет реалистично использоваться для любая причина.

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

+0

Вам нужно будет предоставить больше контекста. Приведите конкретный пример, к чему мы можем относиться. Как и сейчас, ответ «нет, это невозможно». С контекстом мы могли бы показать вам альтернативы ... – blubb

+0

Можно ли включить Enum1 в проект, от которого зависят как project1, так и project2? –

+0

@PaulHicks Не совсем, потому что такого проекта не существует. Хотя я мог (и, вероятно, должен был) сделать это, я бы хотел избежать дальнейшего усложнения этого проекта. –

ответ

1

Я бы решил это путем генерации кода. Где-то в процессе сборки проекта, содержащего Enum2, прочитайте Enum1 и создайте Enum2 в папке сгенерированного источника. Все основные системы сборки и IDE отлично справляются с поддержкой генерируемого кода.

И для фактического генерации кода, вы в основном есть 3 варианта:

  • основе шаблонов, с помощью рамки шаблона, как Velocity или усов
  • АСТ на основе, используя структуру генератора кода как JCodeModel
  • Сделайте себя старую добрую конкатенацией

меня an example project из конференции говорить о моем, где я показываю, как для интеграции JCodeModel с сборкой Maven с использованием Groovy. Вы можете использовать его в качестве отправной точки.