[java] String.valueOf () 대 Object.toString ()

자바에서의 차이가 String.valueOf(Object)Object.toString()? 이에 대한 특정 코드 규칙이 있습니까?



답변

에 따르면 자바 문서 , String.valueOf()반환 :

인수가이면 null문자열과 "null"; 그렇지 않으면의 값 obj.toString()이 반환됩니다.

따라서 추가 메소드 호출을 제외하고는 실제로 차이가 없어야합니다.

또한의 경우 Object#toString인스턴스가 인 null경우 a NullPointerException가 발생하므로 덜 안전 합니다.

public static void main(String args[]) {
    String str = null;
    System.out.println(String.valueOf(str));  // This will print a String equal to "null"        
    System.out.println(str.toString()); // This will throw a NullPointerException
} 


답변

String.valueOf (Object)와 Object.toString ()의 차이점은 다음과 같습니다.

1) 문자열이 null이면

String.valueOf(Object)null 포인터 예외가 발생 null하지만 을 반환 Object::toString()합니다.

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

    System.out.println(String.valueOf(str));  // it will print null        
    System.out.println(str.toString()); // it will throw NullPointerException        
}  

2) 서명 :

String 클래스의 valueOf () 메소드는 정적입니다. 반면 String 클래스의 toString () 메소드는 정적이 아닙니다.

문자열 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)

문자열 toString()메소드 의 서명 또는 구문 은 다음과 같습니다.

public String toString()


답변

Java에서 String.valueOf (Object)와 Object.toString () 사이에 차이점이 있습니까?

예. (과부하를 고려한다면 더 그렇습니다!)

javadoc이 설명 하듯이 메소드에 String.valueOf((Object) null)의해 특별한 경우로 취급되고 valueOf"null"이 리턴됩니다. 대조적 null.toString()으로 NPE를 제공합니다.

과부하

그것은 밝혀 String.valueOf(null)(! 차이를주의) 하지 javadoc가에도 불구하고 … NPE을 제공합니다. 설명이 모호합니다.

  1. 의 과부하에는 여러 가지가 String.valueOf있지만 여기에 관련된 두 가지가 있습니다 : String.valueOf(Object)String.valueOf(char[]).

  2. 이 식에서 는 할당이 모든 참조 유형과 호환 되므로 String.valueOf(null)두 과부하 모두 적용 가능null 합니다.

  3. 적용 가능한 과부하 가 둘 이상 있는 경우 JLS는 가장 특정한 인수 유형에 대한 과부하 가 선택 되었다고 말합니다 .

  4. 이후 char[]의 하위 유형입니다 Object, 그것은이다 더 구체적인 .

  5. 따라서 String.valueOf(char[])과부하가 호출됩니다.

  6. String.valueOf(char[])인수가 널 배열 인 경우 NPE를 처리합니다. 와 달리 특별한 경우로 String.valueOf(Object)취급되지 않습니다 null.

호출 javap -c이있는 메소드의 코드를 검사 하여 이를 확인할 수 있습니다 String.valueOf(null). 호출에 사용 된 과부하를 관찰하십시오.

또 다른 예는 valueOf(char[])과부하 의 차이를 훨씬 더 명확하게 보여줍니다.

char[] abc = new char[]('a', 'b', 'c');
System.out.println(String.valueOf(abc));  // prints "abc"
System.out.println(abc.toString());       // prints "[C@...."

이에 대한 특정 코드 규칙이 있습니까?

아니.

사용하는 컨텍스트의 요구 사항에 가장 적합한 것을 사용하십시오. ( 작동하려면 서식 이 필요 합니까?null 합니까?)

참고 : 이것은 코드 규칙이 아닙니다. 그냥 상식 프로그래밍입니다. 어떤 문체 규칙이나 “모범 사례”교리를 따르는 것보다 코드가 올바른 것이 더 중요합니다 .


개인적인 의견 :

일부 개발자는 null에 대해 “방어”하는 나쁜 습관을 (IMO) 얻습니다. 따라서 널에 대한 많은 테스트와 널을 특수한 경우로 취급합니다. 아이디어는 NPE가 발생하는 것을 막는 것 같습니다.

나는 이것이 나쁜 생각이라고 생각합니다. 특히, 당신이 찾을 때 당신이하는 일 null이 왜 거기에 있었는지를 고려하지 않고 “좋은 것”을 시도 하는 것이 나쁜 생각이라고 생각합니다 null.

일반적으로 응용 프로그램이나 API 디자인에 매우 특별한 의미가 null없다면 처음에는 존재하지 않는 null것이 좋습니다. 따라서 많은 방어 코딩으로 NPE를 피하는 대신 NPE가 발생하도록 한 다음 NPE null를 트리거 한 예기치 않은 원인을 추적하고 수정하는 것이 좋습니다.

여기 어떻게 적용됩니까?

글쎄, 당신이 그것에 대해 생각하면 사용 하는 “좋은”방법 String.valueOf(obj) 있습니다. 피해야합니다. 위해 예기치 않은 상황이라면 objnull맥락에서, 그것을 사용하는 것이 좋습니다 obj.toString().


답변

대부분 다른 답변에서 이미 언급되었지만 완전성을 위해 추가합니다.

  1. 프리미티브는- 클래스 .toString()의 구현이 아니므로 a 를 갖지 Object않으므로 사용할 String.valueOf수 있습니다.
  2. String.valueOf이다 주어진 객체 변환 할 null문자열을 "null", 반면 .toString()발생합니다 NullPointerException.
  3. 컴파일러는 String.valueOf비슷한 것을 사용할 때 기본적으로 String s = "" + (...);사용합니다. 그렇기 때문에 NPE가 아닌 Object t = null; String s = "" + t;String이 "null"됩니다. 편집 : 실제로 StringBuilder.append, not 을 사용합니다 String.valueOf. 그래서 내가 여기서 말한 것을 무시하십시오.

그뿐만 아니라, 여기에 사용 사례 실제로 String.valueOf.toString()다른 결과를 가지고는 :

다음과 같은 일반적인 방법이 있다고 가정 해 봅시다.

public static <T> T test(){
  String str = "test";
  return (T) str;
}

그리고 우리는 Integer이것을 다음과 같은 유형으로 부를 것입니다 : Main.<Integer>test().

문자열을 만들면 String.valueOf정상적으로 작동합니다.

String s1 = String.valueOf(Main.<Integer>test());
System.out.println(s1);

testSTDOUT으로 출력 됩니다.

.toString()그러나 다음 과 같이 작동하지 않습니다.

String s2 = (Main.<Integer>test()).toString();
System.out.println(s2);

다음과 같은 오류가 발생합니다.

java.lang.ClassCastException: 클래스 java.lang.String를 클래스로 캐스트 할 수 없습니다java.lang.Integer

온라인으로 사용해보십시오.

이유에 관해서는 이 분리 된 질문과 그 답변을 참조 할 수 있습니다 . 그러나 간단히 말해서 :

  • 사용하는 경우 .toString()먼저 컴파일에 캐스팅 객체, 평가합니다 T(AN입니다 StringInteger이 경우 캐스트)가 발생됩니다 ClassCastException.
  • 사용 String.valueOf하면 컴파일 T하는 Object동안 일반 을 볼 수 있으며 심지어는 신경 쓰지 않아도 Integer됩니다. 따라서 컴파일러가 무시 하는 Objectto 를 캐스팅합니다 Object. 그런 다음을 사용 하여 예상대로 String.valueOf(Object)결과 String를 얻습니다. 따라서 매개 변수가 내부적으로 매개 변수에 대한 String.valueOf(Object)작업을 수행 하더라도 .toString()캐스트를 건너 뛰고을 처리 하여의 사용으로 발생 Object하는 ClassCastException것을 피했습니다 .toString().

여기 String.valueOf.toString()여기의 추가 차이점을 언급 할 가치가 있다고 생각했습니다 .


답변

String.valueOf(Object)그리고 Object.toString()말 그대로 같은 일이다.

당신의 구현을 살펴 가지고가는 경우에 한 String.valueOf (개체) , 당신은 볼 수 있습니다 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();
}


답변

가장 중요한 차이점은 null 문자열 참조를 처리하는 방식입니다.

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


답변

argument가 null인 경우을 String.valueOf반환 "null"하지만을 Object.toString던집니다 NullPointerException. 이것이 유일한 차이점입니다.