2015-04-02 96 views
8

Czy istnieje pakiet definiujący rozmiar prymitywów Java, które można zaimportować do mojego projektu? Wykonuję ręczne ustawianie bitów i utrzymuję indeks bajtów. Nie chcę robić currentByte += 4, kiedy ustawiam int (magiczne liczby są mile widziane), raczej robię currentByte += <SomePackage>.SIZE_OF_INTCzy Java definiuje rozmiar swoich typów pierwotnych w dowolnym miejscu?

Myślę, że mogę zdefiniować własne, ale to trochę przytyka, zwłaszcza jeśli są one gdzieś dostępne.

+2

[Primitive Datatypes w Javie] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) – nem035

+2

Jeśli używasz 'currentByte', to prawdopodobnie masz lepszą strukturę danych może używać, na przykład bufor. – chrylis

+0

Próbuję zachować minimalne zmiany ze względów procesowych, ale daję taką myśl. – ventsyv

Odpowiedz

24

Nie jest to klasa, ale masz Integer.SIZE itd. Również dla klas Long i zmiennoprzecinkowej. Masz również *.BYTES.

Zatem Integer.SIZE to 32, Integer.BYTES to 4, Double.SIZE to 64, a Double.BYTES to 8 itd. Itp .; wszystkie te są int s na wypadek, gdybyś się zastanawiał.

UWAGA: *.BYTES są zdefiniowane wyłącznie od Java 8 (dzięki @Slanec dla zauważając)

(? *.SIZE pojawił się w Java 5, ale zrobić wykorzystanie przynajmniej, że po prawej)

I tak, jest to zdefiniowane przez JDK, ponieważ sam JLS definiuje rozmiar typów pierwotnych; masz zatem gwarancję, że będziesz mieć te same wartości dla tych stałych przy dowolnej implementacji Java na dowolnej platformie.

+0

Java SE 7 to moja docelowa dystrybucja. – ventsyv

+0

@ventsyv to masz co najmniej '* .SIZE' – fge

8

Specyfikacja wielkości pierwotnych jest zawarty w Java język opisu w Section 4.2

Integralne typy bajt, krótkie, Int i długości, których wartości są 8-bitowe, 16-bitowe 32-bitowe i 64-bitowe liczby całkowite z dopełnieniem dwóch uzupełniających się, odpowiednio, oraz char, których wartości to 16-bitowe liczby całkowite bez znaku reprezentujące jednostki kodowe UTF-16 (§3.1).

To standardowe i nie zmieni, więc nie trzeba importować je. Można ich używać jako magicznych liczb (choć jak fge Zwraca uwagę, że są to magiczne liczby, które są przechowywane w rozsądnych miejscach w różnych klasach pakowania od wersji Java 5 i powinieneś ich raczej używać, niż samemu je redefiniować).

+1

Standardy zmieniaj – shookees

+3

@Shookees każda zmiana tych wartości byłaby zepsutą zmianą dla wszystkich plików klas i ich kompatybilności wstecz i do przodu.To, że "twój kod już nie działa * zgodnie z zamierzeniem *" byłby mniejszy niż "twój kod już nie działa". Nie wierzę, że te mogą się w ogóle zmienić i pozostaną w Javie. Biorąc pod uwagę, że 'Integer.SIZE' jest statycznym finałem i jest wymieniany w czasie kompilacji, użycie wartości w liczbie całkowitej, gdyby miało ulec zmianie, byłoby również zmianą łamania, aby zmienić ją w późniejszej wersji. –

+3

@Shookees, podczas gdy absolutnie nie zgadzam się, że standardy się zmieniają, byłbym wygodny nazywając to coś, co na ogół się nie zmieni. Oracle jest w tyle za Javą, a Oracle nie jest firmą, która zmienia takie rzeczy. Patrząc na standardy podobnych firm i konsorcjów, jest to rodzaj szczegółów, które schylaliby się do tyłu, aby uniknąć zmian. Jeśli specyfikacja językowa jest wystarczająco napięta, by spowodować zmianę tego przez Oracle, mam wrażenie, że byłoby tak wiele innych kwestii, które byłyby najmniejsze z twoich zmartwień. –