String.valueOf() vs. Object.toString()

В Java есть ли разница между String.valueOf(Object) и Object.toString()? Существует ли для них конкретное условное соглашение?

Ответ 1

Согласно документации Java, String.valueOf() возвращает:

если аргумент null, тогда строка равна "null"; в противном случае возвращается значение obj.toString().

Таким образом, не должно быть разницы, кроме вызова дополнительного метода.

Кроме того, в случае Object#toString, если экземпляр null, будет выброшен NullPointerException, поэтому он, возможно, менее безопасен.

Ответ 2

Различия между String.valueOf(Object) и Object.toString():

1) Если строка равна null,

String.valueOf(Object) будет печатать нулевое значение, тогда как Object.toString() будет генерировать исключение исключающего указателя.

public static void main(String args[]){  
    String str = null;

    System.out.println(String.valueOf(str));  // it will prints null        
    System.out.println(str.toString()); // it will throw NullPointer Exception        
}  

2) Подпись:

Метод valueOf() класса String является статическим. тогда как метод toString() класса String не статичен.

Подпись или синтаксис метода string valueOf() приводится ниже:

public **static** String valueOf(boolean b)  
public **static** String valueOf(char c)  
public **static** String valueOf(char[] c)  
public **static** String valueOf(int i)  
public **static** String valueOf(long l)  
public **static** String valueOf(float f)  
public **static** String valueOf(double d)  
public **static** String valueOf(Object o)

Подпись или синтаксис метода string toString() приведен ниже:

public String toString()

Ответ 3

В Java существует ли разница между String.valueOf(Object) и Object.toString()?

Да.

Как объясняет javadoc, String.valueOf(null) будет рассматриваться как частный случай, тогда как null.toString() просто даст вам NPE.

Существует ли для них конкретное условное соглашение?

Нет.

Использование, которое когда-либо наиболее подходит для требований контекста, в котором вы его используете. (Вам нужно форматирование для работы null?)

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


Личное мнение:

Некоторые разработчики приобретают (IMO) плохую привычку "защищать" от нулей. Таким образом, вы видите множество тестов для нулей и обработку нулей в качестве особых случаев. Идея, похоже, предотвращает появление NPE.

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

В общем, лучше избегать того, чтобы null был там, в первую очередь..., если он не имеет особого значения в вашем приложении или дизайне API. Поэтому, вместо того, чтобы избегать NPE с большим количеством защитного кодирования, лучше разрешить NPE, а затем отследить и исправить источник неожиданного null, который вызвал NPE.

Итак, как это применимо здесь?

Ну, если вы думаете об этом, использование String.valueOf(obj) может быть способом "создания хорошего". Этого следует избегать. Если для контекста obj неожиданно будет null в контексте, лучше использовать obj.toString().

Ответ 4

String.valueOf(Object) и Object.toString() буквально одно и то же.

Если вы посмотрите на реализацию String.valueOf(Object), вы увидите, что String.valueOf(Object) в основном просто нуль-безопасный вызов toString() соответствующего объекта:

Returns the string representation of the Object argument.

Parameters:
    obj an Object.
Returns:
    if the argument is null, then a string equal to "null"; 
    otherwise, the value of obj.toString() is returned.
See also:
    Object.toString()

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Ответ 5

Самое важное отличие заключается в том, как они обрабатывают нулевые ссылки на String.

String str = null;
System.out.println("String.valueOf gives : " + String.valueOf(str));//Prints null
System.out.println("String.toString gives : " + str.toString());//This would throw a NullPointerExeption

Ответ 6

Существует еще одно существенное различие между двумя методами: когда объект, который мы преобразуем, является массивом.

При преобразовании массива с использованием Object.toString() вы получите какое-то значение мусора (@, за которым следует хэш-код массива).

Чтобы получить удобочитаемый toString(), вы должны использовать String.valueOf(char []); PLZ отметить, что этот метод работает только для Array типа char. Я бы рекомендовал использовать Arrays.toString(Object []) для преобразования массивов в String.

Второе отличие заключается в том, что объект имеет значение null, ValueOf() возвращает строку "null", а toString() возвращает исключение с помощью исключающего указателя.

Ответ 7

Ниже приведена реализация для java.lang.String.valueOf, как описано в источнике для jdk8u25. Так что, согласно моему комментарию, нет никакой разницы. Он вызывает "Object.toString". Для примитивных типов он переносит его в свою объектную форму и вызывает на нем "toString".

См. ниже:

/*
 * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */


    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

    public static String valueOf(char data[]) {
        return new String(data);
    }

    public static String valueOf(char data[], int offset, int count) {
        return new String(data, offset, count);
    }

    public static String copyValueOf(char data[], int offset, int count) {
        return new String(data, offset, count);
    }

    public static String copyValueOf(char data[]) {
        return new String(data);
    }

    public static String valueOf(boolean b) {
        return b ? "true" : "false";
    }

    public static String valueOf(char c) {
        char data[] = {c};
        return new String(data, true);
    }

    public static String valueOf(int i) {
        return Integer.toString(i);
    }

    public static String valueOf(long l) {
        return Long.toString(l);
    }

    public static String valueOf(float f) {
        return Float.toString(f);
    }

    public static String valueOf(double d) {
        return Double.toString(d);
    }

Ответ 8

Когда аргумент null, String.valueOf возвращает "null", но Object.toString throws NullPointerException, что единственная разница.

Ответ 9

Я не могу точно сказать, в чем разница, но существует разница при работе на уровне байта. В следующем сценарии шифрования Object.toString() создала значение, которое невозможно было расшифровать, тогда как String.valueOf() работал по назначению...

private static char[] base64Encode(byte[] bytes) 
{   
    return Base64.encode(bytes);
}

private static String encrypt(String encrypt_this) throws GeneralSecurityException, UnsupportedEncodingException 
{
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
    SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
    Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
    pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20));

     //THIS FAILED when attempting to decrypt the password
    //return base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8"))).toString(); 

    //THIS WORKED
    return String.valueOf(base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8"))));
}//end of encrypt()