Object o
매개 변수 가있는 메소드가 있습니다.
이 방법에서는 String
null이 아닌 “o” 가 있음을 정확히 알고 있습니다 . 확인하거나 다른 작업을 수행 할 필요가 없습니다. 나는 그것을 String
물건 과 똑같이 취급해야 합니다.
그냥 궁금한 것-더 싼 것이 무엇입니까-그것을 캐스팅 String
하거나 사용 Object.toString()
합니까? 아니면 시간-/ cpu- / mem- 가격으로 동일합니까?
업데이트 :이 메서드는 Object
인터페이스의 구현이므로 수락 합니다. 매개 변수 유형을 변경할 수있는 방법이 없습니다.
그리고 그것은 전혀 될 수 없습니다 null
. 나는 null이나 비어 있는지 확인할 필요가 없다고 말하고 싶었습니다. 제 경우에는 항상 비어 있지 않은 문자열이 있습니다.
답변
String으로 캐스팅 하는 것은 외부 함수 호출이 필요하지 않고 내부 유형 검사 만 필요하기 때문에 저렴 합니다.
답변
나는 캐스트를 사용합니다. 그것은 그것이 문자열이라는 당신의 “지식”을 검증합니다. 어떤 이유로 든 버그로 끝나고 누군가 문자열이 아닌 다른 것을 전달한다면 결함이있는 데이터로 계속 실행하는 것보다 예외를 던지는 것이 더 나을 것이라고 생각합니다.
답변
어리석은 성능 musings 에 따르면 : x.toString () 대 (String) x
결국 결과는 놀랍도록 분명합니다. Object.toString ()을 호출하는 것보다 Object를 String으로 캐스팅하는 것이 적어도 두 배 빠릅니다.
답변
Object o가 String이라는 것을 알고 있다면 그냥 String으로 캐스트하고 그렇게 강제한다고 말하고 싶습니다. 확실하게 String이라는 것을 알고있는 객체에서 toString ()을 호출하면 혼란을 더할 수 있습니다.
Object o가 String이 아닌 다른 것일 수 있다면 toString ()을 호출해야합니다.
답변
이 작업이 1 초에 수천 번만 수행된다면 성능에 크게 신경 쓰지 않을 것입니다. 눈에 띄는 차이는 없습니다.
그러나 나는 입력을 “알고있는”것에 대해 걱정할 것입니다. 당신은를 받아들이는 메소드를 가지고 있고 Object
그것을 그렇게 취급해야합니다. 즉 , 인터페이스를 준수하는 것 외에는 매개 변수에 대해 아무것도 몰라 야 Object
합니다.toString()
메소드 . 이 경우 아무 것도 가정하는 대신 그 방법을 사용하는 것이 좋습니다.
OTOH 입력이있는 경우, 항상 하나 String
또는 null
단지 받아들이는 방법 변경 String
들, 그리고 명시 적으로 확인 null
(… 비 프리미티브를 처리 할 때마다 당신이 어쨌든해야하는)의
답변
참조 유형이 Object이고 모든 Object에 toString ()이있는 경우 object.toString ()을 호출하면됩니다. String.toString ()은 이것을 반환합니다.
- toString ()은 입력 할 코드가 적습니다.
- toString ()은 바이트 코드가 적습니다.
- 캐스팅은 비용이 많이 드는 작업 대 다형성 호출입니다.
- 캐스트가 실패 할 수 있습니다.
- null이 아닌 경우 object.toString ()을 호출하는 String.valueOf (object)를 사용하십시오.
답변
“o”에있는 것이 문자열이면 별다른 차이가 없습니다 (캐스트가 더 빠를 가능성이 있지만 VM / 라이브러리 구현 항목입니다).
“o”가 문자열이 아닐 수도 있지만 문자열이어야한다면 캐스트는 원하는 것입니다 (하지만 메서드가 객체 대신 문자열을 사용하도록해야합니다).
“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();
}