У меня есть метод с Object o
параметром.
В этом методе я точно знаю, что String
в «o» есть ненулевое значение. Проверять или делать что-то еще не нужно. Я должен относиться к нему как к String
предмету.
Просто любопытно - что дешевле - закинуть String
, или использовать Object.toString()
? Или по цене времени / процессора / памяти то же самое?
Обновление: метод принимает, Object
потому что это реализация интерфейса. Нет возможности изменить тип параметра.
А этого не может быть null
вообще. Я просто хотел сказать, что мне не нужно проверять его на нуль или пустоту. В моем случае всегда есть непустая строка.
Ответы:
приведение к String дешевле, поскольку не требует вызова внешней функции, а только проверки внутреннего типа.
источник
Я бы использовал гипс. Это подтверждает ваше «знание» того, что это строка. Если по какой-либо причине вы обнаружите ошибку, и кто-то передаст что-то, кроме строки, я думаю, было бы лучше выбросить исключение (что и сделает приведение), чем продолжать выполнение с ошибочными данными.
источник
Согласно глупым размышлениям о производительности: x.toString () vs (String) x
источник
Если вы знаете, что Object o является String, я бы сказал, просто приведите его к String и обеспечьте его таким образом. Вызов toString () для объекта, который, как вы точно знаете, является String, может только добавить путаницы.
Если Object o может быть чем угодно, кроме String, вам нужно вызвать toString ().
источник
(string)Registry.GetValue...
вызывает исключение при попытке привести объект Int32, тогда какRegistry.GetValue...ToString()
работает должным образом.Меня бы не особо волновала производительность, если эта операция выполняется хотя бы несколько тысяч раз в секунду - ощутимой разницы нет.
Однако я был бы обеспокоен "знанием" ввода. У вас есть метод, который принимает,
Object
и вы должны рассматривать его как таковой, т.е. вы не должны ничего знать о параметре, кроме того, что он привязан кObject
интерфейсу, у которого естьtoString()
метод. В этом случае я настоятельно рекомендую использовать этот метод вместо того, чтобы просто предполагать что-либо.OTOH, если вход всегда либо
String
илиnull
, просто измените метод, чтобы принятьString
s, и явно проверьтеnull
s (что вы должны делать в любом случае, когда имеете дело с непримитивами ...)источник
Учитывая, что ссылочный тип - это объект, а все объекты имеют toString (), просто вызовите object.toString (). String.toString () просто возвращает это.
источник
Если то, что у вас есть в «o», является String, тогда нет большой разницы (вероятно, приведение быстрее, но это вещь реализации VM / библиотеки).
Если «o» не может быть String, но предполагается, что это String, тогда приведение - это то, что вы хотите (но вы должны заставить метод принимать String вместо Object).
Если «o» может быть любым типом, тогда вам нужно использовать toString, но сначала обязательно проверьте значение null.
void foo(final Object o) { final String str; // without this you would get a class cast exception // be wary of using instanceof though - it is usually the wrong thing to do if(o instanceof String) { str = (String)o; } }
или
void foo(final Object o) { final String str; // if you are 100% sure that o is not null then you can get rid of the else if(o != null) { str = o.toString(); } }
Я бы предпочел закодировать последний как:
void foo(final Object o) { final String str; if(o == null) { throw new IllegalArgumentException("o cannot be null"); } str = o.toString(); }
источник
final
переменная не была инициализирована). Вам нужен объектelse
, который либо вызовет исключение, либоstr
что-то инициализирует .Как ни странно, я обнаружил, что приведение выполняется медленнее, чем поиск vtable, подразумеваемый вызовом tostring.
источник
В o не может быть «нулевой строки». Если o имеет значение NULL, он не содержит нулевой строки, это просто NULL. Просто сначала отметьте o на null. Если вы
бросилиили вызов ToString () на нуль рухнет.источник