IllegalArgumentException - действительно ответ здесь, но я бы сказал, что у вас есть проблемы с вашим дизайном. По сути, ваш инвариант класса зависит от состояния некоторого внешнего объекта, что является нарушением инкапсуляции. Невозможно определить, будет ли вызов вашего конструктора успешным без знания какого-либо другого объекта, что приводит к запутанному и легко используемому API.
Эта проблема несколько смягчается, если список, на который вы ссылаетесь, является static final
неизменяемым списком (см. java.util.Collections.unmodifiableList()
) и содержится в рассматриваемом классе, но я до сих пор не очень его люблю. Лучше, если возможно, инкапсулировать приемлемые значения параметров в enum
, что полностью исключит необходимость исключения. Я вообще не люблю исключения, сгенерированные из конструкторов. Если вы должны выбросить исключение, используйте вместо этого фабричный метод.
Если вам недоступен какой-либо вариант, который устраняет необходимость во внешнем списке, возможно, вам придется пересмотреть свой дизайн.