Что является стандартным для именования интерфейса в java api

меня спрашивает один из коллег о Throwable класс в Java API.

согласно стандарту, я понимаю, что каждое слово, заканчивающееся * able, является интерфейсом в Java API. Существует отраслевой стандарт использования таких слов, как имена интерфейсов. Итак, я неосознанно рассказал ему об этом как базовом интерфейсе для всех типов исключений и ошибок в мире java. Затем он показывает мне файл Java для этого класса.

мои вопросы:

  1. почему java люди выбрала это имя, чтобы быть классом. Я думаю, что это должен быть интерфейс по умолчанию?

  2. это шаблон для использования * способных слов в качестве интерфейса?

  3. есть ли другой пример класса, заканчивающегося на *able?

С уважением.

5 ответов


это очень распространено для тех "- способных "имен быть интерфейсами в Java, но нет официального соглашения для именования интерфейса, которое я нашел, что предполагает, что "- способные " имена должны быть именами интерфейса, хотя обычно это так.

официальные соглашения об именах Java можно найти здесь - это довольно скудно, на самом деле нет никаких ограничений для именования классов или интерфейсов:

Что касается вашего Throwable вопрос, Джеймс Гослинг ответил, почему это класс, а не интерфейс, хотя название было более подходящим для интерфейса.

к сожалению, оригинальная статья с сайта Sun/Oracle исчезла в интернет-эфире, поэтому я могу предоставить только косвенные атрибуция:

edit: поскольку я продолжаю получать ответы на этот вопрос, я нашел ссылку на обсуждение Sun через Машина Wayback здесь: http://web.archive.org/web/20071013225816/http://java.sun.com/features/2002/03/gosling.html?source=jdc_news&date=20020430

JDC: почему Throwable не является интерфейсом? Судя по названию, так и должно было быть. Будучи в состоянии поймать для типов, то есть что-то вроде try{}catch (), а не только классы. Это сделало бы язык программирования Java гораздо более гибким.

JG: причина в том, что Throwable и остальные из этих парней не являются интерфейсами, потому что мы решили,или я решил довольно рано. я решил, что хочу иметь некоторое состояние, связанное с каждым исключением, которое выбрасывается. И вы не можете сделать это с интерфейсами; вы можете сделать это только с классами. состояние, которое есть, в основном стандартное. Есть сообщение, есть моментальный снимок, что-то вроде этого, что всегда есть. а также, если вы делаете Throwable интерфейс соблазн назначить, чтобы сделать любой старый объект быть Throwable вещь. Стилистически кажется, что бросать общие объекты, вероятно, плохая идея, что вещи, которые вы хотите бросить, действительно должны быть вещами, которые предназначены для исключений, которые действительно отражают природу исключения и то, что произошло. Это не просто общие структуры данных.


существительные всегда используются для именования классов, но Throwable является исключением.

(видите, что я там сделал?)


есть и другие, такие как

и, конечно, есть много интерфейсов, которые не заканчиваются на -в состоянии. Некоторые люди любят префикс всех своих имен интерфейса с "I" (IAdjustable вместо регулируемый). Как и войны форматирования кода, их не является универсальным соглашением. У Sun есть некоторые предложения но они довольно расплывчатые.


  1. имена интерфейсов всегда должны быть прилагательным и, если возможно, должны заканчиваться на "состоянии", была тенденция к соглашениям об именах в сообществе Java. Это не должно строго соблюдаться, это просто соглашение об именах, ничто не мешает вам называть интерфейс/класс так, как вы хотите.

  2. да, см. http://www.iwombat.com/standards/JavaStyleGuide.html#Class%20and%20Interface%20Names

  3. Clonable

* обратите внимание, что имена интерфейсов обычно должны быть прилагательными, тогда как имена классов должны быть существительными.

проверьте страницу 15 этого документа руководства по стилю, выпущенного Sun. http://java.sun.com/docs/codeconv/CodeConventions.pdf

есть также некоторые дебаты о том, хорошо ли это стиль для добавления буквы I в интерфейсы. (Пример: ICat, IDog и т. д.), но это обычно относится к другим языкам, а не к Java, скажем.

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


мы говорим о именования здесь и да, * able является предпочтительным соглашением для именования интерфейсов. Я уверен, вы видели, что всегда есть исключения. Например, System.arraycopy не верблюжий корпус.