최근에 제 3 자 해시 함수의 코드를 C++에서 C로 리팩터링했습니다.이 프로세스는 상대적으로 어려움이 없었습니다. 이제 자바에서 같은 함수를 작성하고 싶지만 약간의 문제가 있습니다.C 매크로에 대한 Java 대체
C/C++ 코드에는 몇 가지 정수 변수 이름을 인수로 취해 그 내용과 몇 가지 상수로 비트 연산을 수행하는 C 전 처리기 매크로가 있습니다. 이 매크로는 여러 곳에서 사용되기 때문에 코드 존재 자체가 공정한 코드 중복을 피할 수 있습니다.
그러나 Java에서는 C 전 처리기에 해당하는 것이 없습니다. 메소드에 인수로 전달 된 기본 유형에 영향을 줄 수있는 방법도 없습니다. 심지어 자동 보킹은 변경 불가능한 객체를 생성합니다. Java 메소드가 단일 값을 반환한다는 사실과 결합하여 매크로를 다시 작성하는 간단한 방법을 찾지 못하는 것 같습니다.
어디서나 손으로 매크로 확장합니다 : 그것은 작동합니다을하지만, 코드 중복이 일 장기적으로 흥미를 만들 수 내가 생각
봉사 부문.
배열을 반환하는 방법을 쓰기 : 이것은 또한 작동합니다,하지만 그것은 반복적으로 같은 코드로 될 것입니다 :
long tmp[] = bitops(k, l, m, x, y, z); k = tmp[0]; l = tmp[1]; m = tmp[2]; x = tmp[3]; y = tmp[4]; z = tmp[5];
인수로 배열을 취하는 방법을 쓰기 : 이것은 모든 변수 이름이 배열 요소 참조로 축소된다는 것을 의미합니다. 어떤 색인이 어떤 변수에 해당하는지 추적하는 것은 다소 어려울 것입니다.
별도의 클래스를 만듭니다.
State
을 적절한 유형의 public 필드와 함께 사용하고이를 메서드의 인수로 사용하십시오. : 이것이 현재 솔루션입니다. 이 메소드는 변수의 이름을 유지하면서 변수를 변경할 수 있습니다. 그러나 다른State
객체간에 값을 앞뒤로 복사하지 않으려면 더 많은 매크로와 변수가 추가 될 때State
클래스가 점점 더 복잡 해지는 단점이 있습니다.
어떻게 Java로 이러한 C 매크로를 다시 작성하겠습니까? 표준 Java 6 Development Kit (타사 라이브러리 또는 별도의 전 처리기없이)에서 제공하는 기능을 사용하여이를 처리하는보다 적절한 방법이 있습니까?
를 사용하여 매크로에
State
이름을 변경하고 실행처럼 결국 프로그램이 보이는 때까지, 상태를 업데이트하는 방법과 코드의 나머지는 모두 교체 귀하의 코드에 전처리 =). –당신이하는 것처럼'State' 객체를 사용합니다. – Gabe
"어느 색인이 어떤 변수에 해당하는지 추적하는 것은 다소 어려울 것입니다." 이런 종류의 변수에는 항상 final int 변수가 있습니다. 그래서 아마 그렇게 나쁘지 않을 것입니다. 왜냐하면 여러분이'state [k]'가'state.k'와 매우 비슷하게 보이지만, 여전히 선호되지는 않기 때문입니다. –