2015-12-21 2 views
1

поэтому у меня есть абстрактный класс, и я готов хранить все значения из подклассов в ImmutableList. Вот пример того, что я имею в видуСохранение значений из абстрактного int при запуске

public abstract class Test { 

... 

public abstract int getValue(); 

} 

то подкласс

public final class Example extends Test { 

@Override 
public int getValue() { 
return 5; 
} 

} 

Есть ли способ сохранить тест # ПолучитьЗначение() в ImmutableList при запуске?

Я пытался сделать что-то вроде

public abstract class Test { 

    public static final ImmutableList<Integer> VALUES = ImmutableList.of(); 

    public Test() { 
     VALUES.add(getValue()); 
    } 

    public abstract int getValue(); 

} 

затем распечатать значения в списке VALUES.

public static void main(String[] args) { 
    Test.LIST.forEach(System.out::println); 
} 

но он не работал.

+0

Вы хотите сохранить только один элемент? Попробуйте Collections.singletonList() или из коллекции google lib ImmutableList – gauee

+0

@gauee да просто int. Я добавил пример того, что я пытался сделать. –

+0

Невозможно изменить состояние неизменяемого объекта после фазы инициализации. private ImmutableList build = ImmutableList.builder(). Add ("5"). Build(); Эти значения должны храниться непосредственно в реализации абстрактного класса. Другой подход - создать конструктор с такими значениями и всегда возвращать копию такого списка. – gauee

ответ

0

Вы можете написать в основной метод, как это:

Reflections reflections = new Reflections("com.TestClassExample");  
Set<Class<? extends >> classes = reflections.getSubTypesOf(TestExampleClass.class); 

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

private static List<Integer> immutableList = new ArrayList<Integer>(); 

Возможно ли это для вашей проблемы?

+0

Это не модульная процедура, поэтому для каждого подкласса это сделает мою жизнь сложнее. –

+0

@Jason Qlueses Помог ли отредактированный ответ? Я могу помочь вам закодировать его. Дай мне знать. –

1

использование initializer block. Можно создать статический блок, который будет выполняться при загрузке класса:

package foo.bar.baz; 

import java.util.*; 

public class Test { 
    static { 
    int MY_INT = 5; 
    List<Object> mylist = new ArrayList<Object>(); 
    mylist.add(new Integer(MY_INT)); 
    } 

    public Test() { 
    // ... 
    } 
} 
+0

Нет, абстрактный метод не является статическим, так что это не сработает. –

Смежные вопросы