Правильный способ смоделировать номер isbn в приложении j2ee

Я пробую веб-приложение, используя сервлеты и jsps, и мне нужно смоделировать номер элемента в моем классе, а также в отображениях гибернации. Какой должен быть тип числа isbn: Long или String? Я сталкивался со многими учебниками, которые используют любой из них... isbn, предположительно, является 10-значным идентификатором... иногда вы сталкиваетесь с числами, такими как 0-85131-041-9, которые не могут быть длинными. В некоторых примерах используются числа без дефисов...

Итак, какой должен быть тип? Какие-либо предложения?

Спасибо

отметка

4 ответа

Решение

Я бы сохранил это в Long свойство и использовать форматтер / парсер (по сути, конвертер). Когда вы собираетесь отобразить его, конвертер должен просто преобразовать Long свойство к человеческому представлению с дефисами в нужных местах. Когда вы собираетесь проверить / сохранить его, конвертер должен удалить все дефисы из переданного значения и поместить его в Long имущество.

По сути, это та же идея, что и для Date поле, которое вы форматируете / анализируете в представлении человека с помощью SimpleDateFormat, Единственное отличие состоит в том, что средство форматирования / синтаксического анализа ISBN недоступно стандартным API Java SE. Вам нужно было бы написать один самостоятельно или принять сторонний (хотя о нем еще ничего не приходит). Наконец, этот преобразователь может быть использован в качестве тега JSP (например, JSTL <fmt:formatDate>) или автономный класс Java, который вызывается функцией EL или когда вы используете JSF, @FacesConverter учебный класс.

Из-за сложного номера ISBN, это действительно более чем часто хранится как String так что разработчику не нужно беспокоиться о допустимых шаблонах. Хорошо это или плохо - это вопрос, который вы должны задать себе и своей команде.

ISBN имеет 13 цифр (см. Вики). Я хотел бы использовать класс, который проверяет правильность данного String, Что-то вроде:

class ISBN {
  private String isbn;
  public ISBN(String isbn) throws ISBNFormatException {
    // you might want to filter hyphens first, before the check
    if(ISBN.isValid(isbn)) this.isbn = isbn;
    else throw new ISBNFormatException(isbn);
  }
  public static boolean isValid(String s) {
   // validate number here, see wiki
  }
}

Это, конечно, может быть слишком много. Если ваше приложение действительно простое, вы можете пойти с String просто хорошо.

Редактировать Дефис разделяет число на группы (язык, издатель и т. Д.). Однако, что касается уникальности числа, переносы (или деление с пробелами) не играют никакой роли.

На самом деле ISBN - это не 10 цифр, а 12 цифр + чек. ISBN FAQ Чек может быть X

Методом определения контрольной цифры для ISBN является модуль 11 с весовыми коэффициентами от 10 до 1. Римская цифра X используется вместо 10, где десять будет в качестве контрольной цифры.

Если вы храните информацию, введенную пользователем, вы должны включить контрольную цифру, и это должна быть строка.

Если вы храните фактический номер ISBN, вы можете проигнорировать проверку, так как вы можете рассчитать ее. Однако, если используются новые 12 цифр, числа больше, чем может содержать длинная, если старые 10 цифр, то она может быть длинной, но вы должны помнить о возможности добавления начальных 0 обратно. Таким образом, в этом случае я бы держал его в строке, удаляя все нечисловые данные, например дефисы.

Также, глядя на этот FAQ, есть возможная причина хранить ISBn разделенным для возможности поиска по частям.

Пять частей ISBN следующие:
1. Текущий ISBN-13 будет иметь префикс "978"
2. Идентификатор группы или страны, который идентифицирует национальную или географическую группу издателей;
3. Идентификатор издателя, который идентифицирует конкретного издателя в группе;
4. Идентификатор заголовка, который идентифицирует конкретный заголовок или издание заголовка;
5. Контрольная цифра - это единственная цифра в конце ISBN, которая проверяет ISBN.

и 5 не нужно сохранять, так как его можно рассчитать, но его нужно получить от пользователей для проверки ввода.

Этот вопрос на самом деле не имеет ничего общего с J2EE, а просто с типами данных Java и, возможно, типами данных в вашей базе данных.

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

Я думаю, если вы не заботитесь о дефисах, вы можете использовать String или long. Тем не менее, длинная будет дополнительной болью в том, что вам придется выяснить, когда показывать начальные нули.

Краткий ответ: я не вижу никакого преимущества в том, чтобы хранить его как число. Используйте строку.

Другие вопросы по тегам