В этом конкретном случае я бы просто проверил аргумент в конструкторе и выдал исключительную ситуацию IllegalArgumentException с описательным сообщением об ошибке. Объект не будет создан, и вызывающий код должен быть восстановлен.
Вы можете сделать это и в методе getInstance (). Одна из причин использования getInstance () заключается в том, что если экземпляры очень разделяемы, чтобы сократить количество создаваемых вами объектов. Например, если у вас может быть несколько объектов RSSStream с одним и тем же URL-адресом, вы можете настроить getInstance () для совместного использования этих экземпляров. (Предполагается, что экземпляры неизменны.)
Есть также шаблон Builder. У вас есть вложенный внутренний класс с именем RSSStream.Builder и вы говорите что-то вроде:
RSSStream rss = new RSSStream.Builder.build(url)
.name("stack overflow")
.refreshTime(2)
.build();
Этот шаблон делает ваш клиентский код более информативным, а также гарантирует, что вы никогда не создадите RSSStream в недопустимом состоянии (методы конструктора генерируют исключение IllegalArgumentException). Строитель достаточно гибок, чтобы заменить всех ваших общедоступных конструкторов.
Обычно я использовал IllegalArgumentException, выбрасывая его из конструктора или метод проверки (чтобы отделить код проверки ошибок от нескольких конструкторов). Я начал использовать метод Builder для своих более важных общедоступных API-интерфейсов, и он мне действительно нравится.
Вы, безусловно, можете использовать эти приемы в ваших классах модели предметной области.