문제

부울 값을 바이트로 압축하는 메서드에 대한 단위 테스트를 작성 중입니다.다양한 비트 위치는 현재 값이 5개만 있는 열거형의 값에 의해 결정되지만 이 숫자가 9가 될 수 있다는 것은 상상할 수 있습니다(극히 가능성은 낮음).

다음과 같은 간단한 테스트를 원합니다.

개인 바이트 m_myNum;열거형 MyEnum {...}

주장(sizeof(m_myNum) <= MyEnum.values().length);

Java에는 sizeof 함수가 없다는 인상을 받았습니다.가장 우아한 해결 방법은 무엇입니까?

---편집하다

내 생각엔 내가 분명하지 않았던 것 같아.나는 정상적인 런타임에 대해 걱정하지 않습니다.내 문제는 이제 모든 정보를 저장하는 바이트를 사용하여 이 코드를 작성할 수 있다는 것입니다. 그러나 코드의 관련 없는 부분에서 Enum이 커지면 비트마스킹 코드가 중단되는 지점에 도달할 수 있습니다.배포된 애플리케이션에서 이를 수행하는 대신 열거형의 상태 수가 저장소 변수의 비트 수를 초과할 때 실패하는 단위 테스트를 갖고 싶습니다. 따라서 프로그래머가 9번째 열거형을 추가하면 이를 조정할 수 있습니다. 변수의 유형을 8비트보다 큰 것으로 변경합니다.

도움이 되었습니까?

해결책

내 생각엔 이 테스트가 당신이 원하는 대로 이루어졌다고 생각해요.이보다 더 일반적인 내용을 알아보는 것은 아마도 시간 낭비일 것입니다.

public void testEnumSizeLessThanOneByte() throws Exception 
{ 
    assertTrue("MyEnum must have 8 or less values.", 
                MyEnum.values().length <= 8);
}

다른 팁

이것이 실제로 문제이고 성능이 그다지 중요하지 않은 경우 항상 비트셋

Java 바이트는 고정된 크기(8비트)를 가지므로 sizeof가 필요하지 않습니다.

나는 찾았다 이 질문 그게 당신에게 도움이 될 수 있습니다 :-)

불행하게도 Java에는 sizeof()가 없습니다. 하지만 이 질문에 대한 답변을 살펴보세요.내가 흥미로웠던 것 중 하나는 이 기사 자바월드에서.

첫째, 그렇습니다. Java에는 sizeof 연산자가 없습니다.그러나 sizeof(byte)는 항상 1입니다.이게 정말 당신이 말하려던 게 맞나요?

둘째, 9개의 부울을 1바이트에 어떻게 맞추려고 했나요?비트마스크는 아니길 바랍니다.

설정된 가장 높은 비트를 찾으려면 다음을 사용할 수 있습니다. Integer.highestOneBit(m_myNum & 0xFF) (문서 참조 여기).


편집하다:열거형에 값이 너무 많으면 저장소를 더 큰 유형으로 변경하는 것에 대해 이야기했습니다.에 따르면 이 질문, 메모리를 사용하지 않을 이유가 없습니다. byte 대신에 int 배열이 없으면.그래서 나는 int 최소한으로 업그레이드하고 long 크기가 32를 초과하는 경우.충분히 간단합니까?

나는 당신이 일반적인 해결책을 찾으려고 노력하고 있다는 것을 알고 있지만, 이 경우에는 게으른 방법을 택하고 크기를 하드 코딩하고 몇 가지 설명을 추가할 것입니다.

static final int MAX_BITS_IN_MY_NUM = 8; // Currently set to size of a byte.  
                                         // Update if data type changes from byte to something larger than a byte.
...
assertTrue(MAX_BITS_IN_MY_NUM >= MyEnum.values().length);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top