Вопрос

В определенном классе Java для веб -приложения Struts2 у меня есть эта строка кода:

try {
    user = findByUsername(username);
} catch (NoResultException e) {
    throw new UsernameNotFoundException("Username '" + username + "' not found!");
}

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

static final String ex = "Username '{0}' not found!" ;
// ...
throw new UsernameNotFoundException(MessageFormat.format(ex, new Object[] {username}));

Но я не вижу смысла использовать MessageFormat в этой ситуации. Что делает это лучше, чем простой строковой конкатенации? Как говорит API JDK для сообщений.

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

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

Должен ли я изменить строку кода или придерживаться текущего?

Это было полезно?

Решение

Должен ли я изменить строку кода или придерживаться текущего?

По словам вашего учителя, вы должны.

Возможно, он хочет, чтобы вы изучили разные подходы для одного и того же.

Хотя в примере вы предоставили, это не имеет большого смысла, это было бы полезно при использовании других типов сообщений или для i18n

Думать об этом:

String message = ResourceBundle.getBundle("messages").getString("user.notfound");

throw new UsernameNotFoundException(MessageFormat.format( message , new Object[] {username}));

У вас может быть messages_en.properties Файл и а messages_es.properties

Первый со строкой:

user.notfound=Username '{0}' not found!

И второй с:

user.notfound=¡Usuario '{0}' no encontrado!

Тогда это будет иметь смысл.

Другое использование сообщения сообщений описано в док

 MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");
 double[] filelimits = {0,1,2};
 String[] filepart = {"no files","one file","{0,number} files"};
 ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
 form.setFormatByArgumentIndex(0, fileform);

 int fileCount = 1273;
 String diskName = "MyDisk";
 Object[] testArgs = {new Long(fileCount), diskName};

 System.out.println(form.format(testArgs));

Вывод с разными значениями для FileCount:

 The disk "MyDisk" contains no files.
 The disk "MyDisk" contains one file.
 The disk "MyDisk" contains 1,273 files.

Так что, возможно, ваш учитель дает вам знать, какие у вас есть возможности.

Другие советы

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

Но я не вижу смысла использовать MessageFormat в этой ситуации

В этом специфический Ситуация не покупает вас много. В целом, использование MessageFormat позволяет вывести эти сообщения в файле. Это позволяет вам:

  • Локализовать сообщения по языку
  • Отредактируйте сообщения снаружи без изменения исходного кода

Лично я бы придерживался пути объединения, но это просто вопрос предпочтения. Некоторые люди думают, что чище писать строку с переменными в качестве одной строки, а затем передавать параметры в виде списка после строки. Чем больше переменных у вас есть в строке, тем больше смысл использует MessageFormat, но у вас есть только один, так что это не большая разница.

Конечно, если вам не нужна интернационализация, это накладные расходы, но в основном код, поскольку учитель хочет, чтобы он был более «международным» (хотя на самом деле не интернационализируется, поскольку строка все еще жестко кодируется).

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

С точки зрения наилучшего способа программы, если интернационализация является требованием, то вам нужно кодировать для нее, если нет, то нет. Я просто добавляю накладные расходы и время (чтобы написать код) без причины.

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

Одно преимущество, которое я вижу в использовании MessageFormat это когда вы решите Внезок Ваши строки, было бы гораздо проще построить сообщение, а также имеет смысл видеть «имя пользователя» {0} 'не найдено! » В файле вашего ресурса в качестве одной строки, доступной только по одному идентификатору.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top