Что является стандартным для именования интерфейсов в Java API - PullRequest
8 голосов
/ 15 октября 2010

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

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

Мои вопросы:

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

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

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

С уважением.

Ответы [ 5 ]

29 голосов
/ 15 октября 2010

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

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

22 голосов
/ 15 октября 2010

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

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

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

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

edit: Поскольку я продолжаю получать ответы на этот вопрос, я нашел ссылку на обсуждение Sun через Wayback Machine , здесь: 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.Стилистически кажется, что бросание общих объектов - это, вероятно, плохая идея, что вещи, которые вы хотите бросить, действительно должны быть вещами, которые должны быть исключениями, которые действительно отражают природу исключения и то, что происходило.Это не просто общие структуры данных.

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

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

  3. Клонируемый

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

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

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

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

2 голосов
/ 15 октября 2010

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

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

1 голос
/ 15 октября 2010

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

...