문제

혼합의 사용은 기본 데이터 유형 및 그들의 각각의 랩퍼 클래스에서,Java,생할 수 있습을 많이 버그가 있습니다.다음 예에서는 이러한 문제를 보여 줍니다:

int i = 4;
...
if (i == 10)
  doStuff();

후에 당신은 그는 당신이 원하는 변수 하거나 정의되거나 정의되지 않은,그래서 당신은 변경은 위의 인스턴스화:

Integer i = null;

지금 확인 평등 실패합니다.

그것은 좋은 Java 연습을 항상 사용하여 원시인 랩퍼 클래스?그것은 분명히 얻을 것이라는 일부 버그 밖의 방법으로 조기이지만,단점은 무엇일까요?그것은 성능에 영향을 줄이거나 응용 프로그램의 메모리 footprint?이 있습 몰래 개는?

도움이 되었습니까?

해결책

박스형 유형 사용 하다 성능과 메모리 문제가 있습니다.

비교를 할 때 (예 : (i == 10) ), Java는 비교를하기 전에 유형을 Unbox를 Unbox해야합니다. 사용조차도 i.equals(TEN) == 구문보다 비용이 많이 드는 메소드 호출을 사용합니다.

RE 메모리, 객체는 힙에 저장되어야합니다 (성능에도 적중) 및 값 자체를 저장해야합니다.

비열한 Gotcha? i.equals(j) 내가있을 때 null.

나는 항상 프리미티브를 사용합니다 5월 ~이다 null, 그러나 항상 확인하십시오 null 그 경우 비교하기 전에.

다른 팁

첫째, 원시를 사용하여 객체를 사용하여 객체를 사용하여 널로 설정할 수있는 기능을 얻는 것은 아마도 나쁜 설계 결정 일 것입니다. 나는 종종 Null이 Sentinel 가치인지 여부에 대한 동료들과 논쟁을 가지고 있으며, 내 의견은 일반적으로 그것이 아니으며 (따라서 Sentinel 가치처럼 금지되어서는 안된다),이 특별한 경우에는 당신이 가고 있습니다. 센티넬 값으로 사용하는 길에서. 제발하지 마십시오. 정수가 유효한지 여부를 나타내는 부울을 만들거나 부울과 정수를 함께 감싸는 새로운 유형을 만듭니다.

일반적으로 최신 버전의 Java를 사용할 때는 1.5 (1.5 자체)에 시간을 추가 한 자동 박스 지원으로 인해 프리미티브의 객체 버전을 명시 적으로 만들거나 캐스트 할 필요가 없습니다.

실제로 "null"이라는 개념이 없다면 항상 프리미티브를 사용하는 것이 좋습니다.

예, VM은 지금 자서전을 수행하지만 지금은 예상치 못한 코드 라인에서 Null 포인터 예외를 얻을 수있는 정말 이상한 사례로 이어질 수 있으며 Null Checks를 시작해야합니다. 모든 수학적 작업에서. 유형을 믹싱하고 더 이상자가 옥스 행동을 얻기 시작하면 끔찍한 행동을 시작할 수도 있습니다.

플로트/복식의 경우 Nan을 NULL로 취급 할 수 있지만 Nan! = Nan이라도 Float.isnan (x)과 같은 특별한 점검이 필요합니다.

복싱의 시간/오버 헤드를 낭비하지 않고 원시 유형을 지원하는 컬렉션이 있다면 정말 좋을 것입니다.

예를 들어, 127을 초과 할 때까지 IF 문은 괜찮습니다 (정수자가 옥싱은 최대 127의 값을 캐시하고 각 숫자에 대해 동일한 인스턴스를이 값으로 반환합니다).

그래서 당신이 제시하는 것보다 더 나쁩니다 ...

if( i == 10 )

이전과 같이 작동하지만

if( i == 128 )

실패합니다. 이와 같은 이유가 필요할 때 항상 객체를 명시 적으로 만들고 가능한 경우 원시 변수를 고수하는 경향이 있습니다.

그 자바 포드 유형이 이유가 있습니다. 오버 헤드 외에도 객체로 일반 작업을 수행 할 수 없습니다. 정수는 물체로 할당되고 쓰레기를 수집해야합니다. int는 그렇지 않습니다.

는 경우에는 값이 비어 있을 수 있습을 찾을 수 있습니다 당신의 디자인에서 필요로 하는 다른 무언가이다.

거기에는 두 가지 경우가 있습니다-하나 이 값은 단지 데이터(코드 없는 행동을 다르게 어떤 경우에 그 채워지지)또는 실제로는 것이 없다는 것을 나타내는 두 개의 서로 다른 유형의 객체가 여기에서(코드 역할을 다르게 값이 있는 경우보다 null)

는 경우에 그것은 단지에 대한 데이터 디스플레이/저장,사용하는 방법을 고려할 수 있습니다 실제 DTO--지 않는 하나 그것으로 첫 번째 클래스의 구성원 모두에.그들은 일반적으로있는 방법을 확인하십시오 값을 설정하거나지 않습니다.

는 경우 체크인을 위한 null 어떤 시점에서,당신이이고 싶을 수도 있 사용하기 때문에 하위 클래스가있는 경우 하나의 차이는,일반적으로있다 더 있습니다.에 적어도 당신이 원하는 더 나은 방법을 나타내는 귀하의 차이보다면"primitiveIntValue==null",그 자체는 아무 의미가 없습니다.

이 시설을 얻기 위해 비 프리미스어로 전환하지 마십시오. 부울을 사용하여 값이 설정되었는지 여부를 나타냅니다. 해당 솔루션이 마음에 들지 않고 정수가 합리적인 한계 (또는 가끔 실패에 신경 쓰지 않거나 가끔 실패에 신경 쓰지 않는다는 것을 알고 있다면 integer.min_value와 같은 '초기화되지 않은'것을 나타내는 특정 값을 사용합니다. 그러나 그것은 부울보다 훨씬 덜 안전한 솔루션입니다.

당신이 그 '나중에'포인트에 도착했을 때, 리팩토링 중에 조금 더 많은 작업을 수행해야했습니다. 가능하면 프리미티브를 사용하십시오. (자본 기간) 더 많은 기능이 필요한 경우 POJO를 만듭니다. 제 생각에 원시 래퍼 클래스는 네트워크 앱을 의미하는 와이어를 가로 질러 이동하는 데 필요한 데이터에 가장 잘 사용됩니다. 허용 가능한 값으로 널을 허용하면 시스템이 자라면서 두통이 발생합니다. 많은 코드가 낭비되거나 놓친 경우 간단한 비교가 무엇인지 보호합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top