Как говорит Джоша Блох в книге « Эффективная Java », null является ключевым словом Java.
Это слово идентифицирует область памяти без указателя на любую другую область памяти: по моему мнению, лучше кодировать с разделением поведения относительно функциональной области (пример: вы ждете объект вида A но вы получаете объект типа B ) и поведение домена низкого уровня (пример: недоступность памяти).
В вашем примере я бы изменил код следующим образом:
public Object getObject(){
Object objectReturned=new Object();
try{
/**business logic*/
}
catch(Exception e){
//logging and eventual logic leaving the current ojbect (this) in a consistent state
}
return objectReturned;
}
Недостатком является создание полного объекта при каждом вызове getObject () (тогда в ситуации, когда объект возвращается не читается и не записывается).
Но я предпочитаю иметь тот же объект бесполезным, чем NullPointerException , потому что иногда это исключение очень трудно исправить.
Я бы посоветовал лучше использовать String.format ()
. Основная причина заключается в том, что String.format ()
может быть более легко локализован с текстом, загруженным из файлов ресурсов, тогда как конкатенация не может быть локализована без создания нового исполняемого файла с другим кодом для каждого языка.
Если вы планируете локализовать свое приложение, вы также должны выработать привычку указывать позиции аргументов для ваших токенов формата:
"Hello %1$s the time is %2$t"
Затем его можно локализовать и поменять местами токены имени и времени, не требуя перекомпиляции исполняемого файла для учета для разного заказа. С позициями аргументов вы также можете повторно использовать тот же аргумент, не передавая его в функцию дважды:
String.format("Hello %1$s, your name is %1$s and the time is %2$t", name, time)
Я не проводил никаких конкретных тестов, но думаю, что конкатенация может быть быстрее. String.format () создает новый Formatter, который, в свою очередь, создает новый StringBuilder (с размером всего 16 символов). Это изрядно накладные расходы, особенно если вы форматируете более длинную строку и StringBuilder постоянно вынужден изменять размер.
Однако конкатенация менее полезна и ее труднее читать. Как всегда, стоит провести тест вашего кода, чтобы увидеть, что лучше. Различия могут быть незначительными в серверном приложении после того, как ваши пакеты ресурсов, локали и т. Д. Загружены в память и код JITted.
Возможно, в качестве наилучшей практики было бы неплохо создать свой собственный форматировщик с правильным размером StringBuilder (Appendable) и Locale и используйте их, если вам нужно выполнить много форматирования.
Какой из них более читабелен, зависит от того, как работает ваша голова.
Вы получили свой ответ прямо здесь.
Это дело личного вкуса.
Я полагаю, что конкатенация строк немного быстрее, но этим можно пренебречь.
String.format ()
- это больше, чем просто конкатенация строк. Например, вы можете отображать числа в определенной локали, используя String.format ()
.
Однако, если вам не важна локализация, функциональной разницы нет. Возможно, один быстрее, чем другой, но в большинстве случаев им можно пренебречь ..
Я провел еще несколько исследований по этому вопросу и обнаружил, что методы equals () и hashcode () также перезаписываются.
Очевидно, что единственной причиной этого может быть добавление javadoc - может быть, поэтому итератор () также был перезаписан.
-121--2402917-Вот версия, которую я выяснил, используя ссылку hobodave:
class Fish
class << self
attr_accessor :var
end
@var = 'fish'
def v
self.class.var
end
end
class Trout < Fish
@var = 'trout'
end
class Salmon < Fish
@var = 'salmon'
end
puts (Trout.new).v # => trout
puts (Salmon.new).v # => salmon
Обратите внимание, что подкласс требует только добавления @ var
- нет необходимости переопределять инициализацию.
О производительности:
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++){
String s = "Hi " + i + "; Hi to you " + i*2;
}
long end = System.currentTimeMillis();
System.out.println("Concatenation = " + ((end - start)) + " millisecond") ;
start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++){
String s = String.format("Hi %s; Hi to you %s",i, + i*2);
}
end = System.currentTimeMillis();
System.out.println("Format = " + ((end - start)) + " millisecond");
}
Результаты синхронизации следующие:
Поэтому конкатенация намного быстрее, чем String.format.