String.valueOf () 대 Object.toString ()
자바에서의 차이가 String.valueOf(Object)
와 Object.toString()
? 이에 대한 특정 코드 규칙이 있습니까?
에 따르면 자바 문서 , String.valueOf()
반환 :
인수가이면
null
어디에서나"null"
; 개체의 값obj.toString()
이 반환됩니다.
따라서 추가 메소드 호출을 제외하고는 실제로 차이가 없어야합니다.
또한 , 가 발생 하는 경우 Object#toString
인스턴스가 인 경우 에는 덜 안전 합니다.null
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을 인쇄하지만 Object.toString()
null 포인터 예외를 발생합니다.
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) 서명 :
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(null)
특별한 경우로 취급 null.toString()
NPE를 제공합니다.
이에 대한 특정 코드 규칙이 있습니까?
아니.
사용하는 것이 요구 사항에 가장 많이 사용하는 것입니다. ( 작동하려면 서식 이 필요null
돌아가?)
참고 : 이것은 코드 규칙이 아닙니다. 그냥 상식 프로그래밍입니다. 어떤 문체 규칙이나 "모범 사례"를 따르는을 구석으로 교리보다 코드가 올바른 것이 더 중요합니다 .
개인적인 의견 :
일부 개발자는 null에 대해 "방어"하는 나쁜 습관을 얻습니다. 따라서 널에 대한 많은 테스트와 널을 특수한 경우로 취급합니다. 아이디어는 NPE가 발생하는 것을 막는 것입니다.
나는 이것이 나쁜 생각이라고 생각합니다. 특히,이 발견했을 당신 때 당신이하는 일 null
이 왜 거기에 있었는지를 고려하지 않고 "좋은 것"시도을 하는 것이 나쁜 생각이라고 생각합니다 null
.
일반적으로 응용 프로그램이나 API 디자인에 매우 구체적인 의미가 null
없는 한 처음부터 그 자리에있는 것을 피하는 것이 좋습니다 null
. 따라서 방어 적 코딩이 많은 NPE를 피하는 것보다 NPE가 발생하도록 한 다음 NPE null
를 트리거 한 예상치 못한 원인을 추적하고 수정하는 것이 좋습니다.
그렇다면 이것이 여기서 어떻게 적용됩니까?
글쎄, 당신이 그것에 대해 생각한다면, 사용 은 "좋은"방법 String.valueOf(obj)
이 될 수 있습니다. 그것은 피해야합니다. 위해 예기치 않은 상황이라면 obj
수 null
맥락에서, 그것을 사용하는 것이 좋습니다 obj.toString()
.
String.valueOf(Object)
그리고 Object.toString()
말 그대로 같은 일이다.
String.valueOf (Object) 구현을 살펴보면 String.valueOf(Object)
기본적으로 toString()
해당 객체 의 null-safe 호출 일뿐 임을 알 수 있습니다 .
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
대부분은 이미 다른 답변에서 언급되었지만 완전성을 위해 추가했습니다.
- 프리미티브는- 클래스
.toString()
의 구현이 아니므로 a 가 없으므로 사용Object
만String.valueOf
가능합니다. String.valueOf
이다 주어진 객체 변환 할null
문자열을"null"
, 반면.toString()
발생합니다NullPointerException
.컴파일러는편집 : 실제로, 사용String.valueOf
다음과 같은 것을 사용할 때 기본적으로String s = "" + (...);
사용합니다. 이것이 NPE가 아닌Object t = null; String s = "" + t;
String 결과가 나오는 이유 입니다"null"
.StringBuilder.append
하지 않습니다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);
이것은 test
STDOUT으로 출력 됩니다.
A를 .toString()
하지만, 그것은 작동하지 않습니다 :
String s2 = (Main.<Integer>test()).toString();
System.out.println(s2);
이로 인해 다음 오류가 발생합니다.
java.lang.ClassCastException
: 클래스java.lang.String
를 클래스로 캐스팅 할 수 없습니다.java.lang.Integer
그 이유는 이 분리 된 질문과 그 답변을 참조 할 수 있습니다 . 그러나 간단히 말해서 :
- 사용하는 경우
.toString()
먼저 컴파일에 캐스팅 객체, 평가합니다T
(AN입니다String
에Integer
이 경우 캐스트)가 발생됩니다ClassCastException
. - 사용할 때 컴파일 하는 동안
String.valueOf
제네릭이 표시 되고 . 그것이 캐스트 있도록 하는 방법에 대해 (컴파일러 그냥 무시한다). 그런 다음을 사용 하여 예상대로 결과 를 얻습니다. 따라서 will이 매개 변수에 대해 내부적으로 수행 하더라도 이미 캐스트를 건너 뛰고으로 처리 되었으므로을 사용하여 발생 하는 문제 를 피했습니다 .T
Object
Integer
Object
Object
String.valueOf(Object)
String
String.valueOf(Object)
.toString()
Object
ClassCastException
.toString()
그냥 사이이 추가 차이를 언급 할 가치라고 생각 String.valueOf
하고 .toString()
여기뿐만 아니라.
인수 인 경우 null
는 String.valueOf
반환 "null"
하지만, Object.toString
발생 NullPointerException
, 그 유일한 차이점입니다.
차이점이 무엇인지 정확히 말할 수는 없지만 바이트 수준에서 작동 할 때 차이가있는 것 같습니다. 다음 암호화 시나리오에서 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()
두 방법 사이에 또 하나의 큰 차이점은 우리가 변환하는 객체가 배열 일 때입니다.
Object.toString ()을 사용하여 배열을 변환하면 일종의 가비지 값 (@ 뒤에 배열의 해시 코드)이 표시됩니다.
사람이 읽을 수있는 toString ()을 얻으려면 String.valueOf (char []); plz는이 메서드가 char 유형의 배열에만 작동합니다. 배열을 String으로 변환하려면 Arrays.toString (Object [])을 사용하는 것이 좋습니다.
두 번째 차이점은 객체가 null 인 경우 ValueOf ()는 String "null"을 반환하는 반면 toString ()은 null 포인터 예외를 반환합니다.
아래는 jdk8u25의 소스에 설명 된대로 java.lang.String.valueOf의 구현을 보여줍니다. 그래서 내 의견에 따라 차이가 없습니다. "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);
}
참고 URL : https://stackoverflow.com/questions/27465731/string-valueof-vs-object-tostring
'IT' 카테고리의 다른 글
리플렉션을 통해 사유 재산을 접근 할 수 있습니까? (0) | 2020.07.22 |
---|---|
SLF4J / Logback에서 마커 사용에 대한 모범 사례 (0) | 2020.07.22 |
데이터베이스 ID 노출-보안 위험? (0) | 2020.07.22 |
DataFrame의 파티셔닝을 정의하는 방법은 무엇입니까? (0) | 2020.07.22 |
Java Enumeration과 Iterator의 차이점 (0) | 2020.07.22 |