В прилагательных Java, заканчивающихся в - способный, интерфейсы Serializable
, Comparable
и т.д... Итак, почему Throwable
класс? Не был бы обработка исключений быть легче если Throwable
был интерфейс? (Редактирование: например, Классы исключений не должны расширять Exception/RuntimeException.)
Очевидно, изменение его теперь отсутствует вопрос. Но это могло быть сделано абстрактным? Не был бы это избегать плохой практики throw new Throwable()
;
Так почему Throwable - это класс?
Я могу придумать две причины:
Разве обработка исключений не была бы проще? если бы Throwable был интерфейсом?
Обработка исключений - сложная тема, независимо от того, являются ли исключения классами или интерфейсами. Я действительно подозреваю, что Java-программистам будет сложнее, если им придется упорядочивать свои блоки catch на основе произвольных интерфейсов, а не иерархий классов.
Но можно ли сделать это абстрактным?
Теоретически да. На практике нет. Слишком много кода зависит от возможности создать экземпляр Throwable для вызова getStackTrace.
Вот как Джеймс Гослинг объяснил свое решение:
Программа подключения Java-разработчика : Почему
Throwable
не является интерфейсом? Название предполагает, что так и должно было быть. Возможностьcatch
для типов, то есть что-то вродеtry {} catch (<некоторый интерфейс или класс>)
, а не только классы. Это сделало бы Java [язык программирования] намного более гибким.Джеймс Гослинг : Причина, по которой
Throwable
и остальные не являются интерфейсами, заключается в том, что мы решили, или я решил довольно рано. Я решил, что хочу иметь какое-то состояние, связанное с каждым генерируемым исключением. А с интерфейсами этого не сделать; вы можете сделать это только с классами. Состояние, которое там есть, в основном стандартное. Есть сообщение, есть снимок и тому подобное - это всегда есть. а также, если вы сделаетеThrowable
интерфейсом, возникнет соблазн назначить, чтобы любой старый объект сталThrowable
вещью. Стилистически кажется, что бросание общих объектов - это, вероятно, плохая идея, что вещи, которые вы хотите бросить, на самом деле должны быть вещами, которые должны быть исключениями, которые действительно отражают природу исключения и то, что произошло. Это не просто общие структуры данных.
Ну, Hashtable - это тоже конкретный класс! Что-то, что можно хешировать.
а что такое клонирование? это неправильное английское слово.