(String) или .toString()?

У меня есть метод с параметром Object o.

В этом методе я точно знаю, что есть String в "o", который не является нулевым. Нет необходимости проверять или делать что-то еще. Я должен рассматривать его точно как объект String.

Просто любопытно - что дешевле - приведите его к String или используйте Object.toString()? Или это то же самое время /cpu -/mem-price?

Обновление: Метод принимает Object, потому что это реализация интерфейса. Невозможно изменить тип параметра.

И вообще не может быть null. Я просто хотел сказать, что мне не нужно проверять его на пустоту или пустоту. В моем случае всегда есть непустая строка.

Ответ 1

литье в String дешевле, поскольку для этого не требуется вызов внешней функции, просто проверка внутреннего типа.

Ответ 2

Я бы использовал актерский состав. Это подтверждает ваши "знания", что это строка. Если по какой-то причине у вас заканчивается ошибка, и кто-то передает что-то другое, кроме строки, я думаю, что было бы лучше создать исключение (которое будет делать приведение), чем продолжать выполнять с неверными данными.

Ответ 4

Если вы знаете, что Object o является строкой, я бы сказал, просто передал ее в String и обеспечил ее таким образом. Вызов toString() для объекта, который, как вы знаете, является строкой, может просто добавить путаницу.

Если Object o может быть чем-то другим, кроме String, вам нужно вызвать toString().

Ответ 5

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

Я бы, однако, был обеспокоен "знанием" ввода. У вас есть метод, который принимает Object, и вы должны рассматривать его как таковой, т.е. Вы не должны знать ничего о параметре, кроме того, что он придерживается интерфейса Object, который имеет метод toString(). В этом случае я настоятельно рекомендую использовать этот метод, а не просто что-то делать.

OTOH, если вход всегда либо String, либо null, просто измените метод, чтобы принять String s, и явно проверьте для null (что вы должны делать в любом случае, когда имеете дело с не-примитивами...)

Ответ 6

Не может быть "нулевой строки в o". Если o имеет значение null, он не содержит пустую строку, это просто значение null. Просто сначала проверьте o для null. Если вы произнесете или вызовите ToString() в нуле, вы сработаете.

Ответ 7

Если то, что у вас есть в "o" , является строкой, тогда нет большой разницы (вероятно, приведение выполняется быстрее, но это вещь реализации VM/Library).

Если "o" может не быть строкой, но предполагается, что это String, то приведение - это то, что вы хотите (но вы должны заставить метод взять строку вместо объекта).

Если "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();
}

Ответ 8

Учитывая, что ссылочным типом является Object и все объекты имеют toString(), просто вызывайте object.toString(). String.toString() просто возвращает это.

  • toString() меньше кода для ввода.
  • toString() меньше байт-кода.
  • литье - дорогостоящая операция VS полиморфного вызова.
  • может произойти сбой.
  • Используйте String.valueOf(object), который просто вызывает object.toString(), если его значение не равно null.

Ответ 9

Мне показалось странным, что приведение было медленнее, чем просмотр vtable, подразумеваемый вызовом tostring.