Как написать на Java функцию, подобную sizeof в C

Если вы только начинаете изучать Java и уже имеете опыт программирования на С, то можете заметить разницу между этими двумя языками. К примеру, String  —  это объект в Java, а не массив символов с конечным NULL. Аналогично, в Java нет оператора sizeof(). Все примитивы имеют заранее определенный размер, например int  —  4 байта, char  —  2 байта, short  —  2 байта, long и float  —  8 байт и так далее.

Но если вам не хватает этого оператора, то почему бы не превратить это в вызов для себя как программиста? Если вы согласны с этим, то ваша следующая задача  —  написать метод на Java, который ведет себя как оператор/функция sizeOf() в C и возвращает размер в байтах для каждого числового примитивного типа, т.е. для всех примитивных типов, кроме Boolean.

Многие из вас, наверное, подумают: почему мы не включаем логическое значение? Разве ему не нужен всего 1 бит для представления истинных и ложных значений? Я не включаю Boolean в это упражнение, потому что размер Boolean строго не определен в спецификации Java и варьируется в зависимости от разных JVM.

Кроме того, размер примитивов в Java фиксирован. Он не зависит от платформы. Таким образом, примитивная переменная int будет занимать 4 байта как в Windows, так и в Linux, как на 32-разрядных, так и на 64-разрядных машинах.

Вот справочная таблица значений по умолчанию для различных примитивных типов в Java:

Теперь в зависимости от ваших творческих способностей вы можете дать несколько ответов. Однако для решения этой задачки будет достаточно одного.

Пример функции sizeof() на Java

Вот полная Java-программа для реализации оператора sizeof. Это не совсем размер, но назначение то же самое. sizeof возвращает информацию о том, сколько памяти занимает определенный тип данных, и этот метод делает то же самое.

/*
* Программа Java выводит размер примитивных типов данных, например byte, int, short, double, float,
* char, short и т.д., в методе, подобном sizeof в C
*
* @author Javin Paul*/

public class SizeOf{

public static void main(String args[]) {

System.out.println(" size of byte in Java is (in bytes) : "
+ sizeof(byte.class));

System.out.println(" size of short in Java is (in bytes) :"
+ sizeof(short.class));

System.out.println(" size of char in Java is (in bytes) :"
+ sizeof(char.class));

System.out.println(" size of int in Java is (in bytes) :"
+ sizeof(int.class));

System.out.println(" size of long in Java is (in bytes) :"
+ sizeof(long.class));

System.out.println(" size of float in Java is (in bytes) :"
+ sizeof(float.class));

System.out.println(" size of double in Java is (in bytes) :"
+ sizeof(double.class));}

/*
* Java-метод для возврата размера примитивного типа данных на основе жестко закодированных значений
* применим в работе, но предоставлен разработчиком
*/

public static int sizeof(Class dataType) {
if (dataType == null) {
throw new NullPointerException();
}

if (dataType == byte.class || dataType == Byte.class) {
return 1;
}

if (dataType == short.class || dataType == Short.class) {
return 2;
}

if (dataType == char.class || dataType == Character.class) {
return 2;
}

if (dataType == int.class || dataType == Integer.class) {
return 4;
}

if (dataType == long.class || dataType == Long.class) {
return 8;
}

if (dataType == float.class || dataType == Float.class) {
return 4;
}

if (dataType == double.class || dataType == Double.class) {
return 8;
}

return 4; // значение по умолчанию для 32-разрядного указателя памяти

}

/*
* Идеальный способ создания запутанного имени метода, sizeof и sizeOf
* Этот метод использует константу SIZE из класса-оболочки
*/

public static int sizeOf(Class dataType) {

if (dataType == null) {
throw new NullPointerException();
}

if (dataType == byte.class || dataType == Byte.class) {
return Byte.SIZE;
}

if (dataType == short.class || dataType == Short.class) {
return Short.SIZE;
}

if (dataType == char.class || dataType == Character.class) {
return Character.SIZE;
}

if (dataType == int.class || dataType == Integer.class) {
return Integer.SIZE;
}

if (dataType == long.class || dataType == Long.class) {
return Long.SIZE;
}

if (dataType == float.class || dataType == Float.class) {
return Float.SIZE;
}

if (dataType == double.class || dataType == Double.class) {
return Double.SIZE;
}

return 4; // значение по умолчанию для 32-разрядного указателя памяти

}

}

Вывод:
size of byte in Java is (in bytes) :  1

size of short in Java is (in bytes) : 2

size of char in Java is (in bytes) : 2

size of int in Java is (in bytes) : 4

size of long in Java is (in bytes) : 8

size of float in Java is (in bytes) : 4

size of double in Java is (in bytes) : 8

Вот и все. Это довольно сложная задача, потому что вы не думаете о том, чтобы воспользоваться преимуществами предопределенного размера типов данных в Java, а также не думаете о том, как задействовать константы размера, определенные в классах-оболочках, таких как Integer и Double.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи javinpaul: How to Write a C-like sizeof Function in Java

Предыдущая статья12 хуков React, которые должен знать каждый разработчик
Следующая статьяСоздание сайдбара с помощью HTML, CSS и JavaScript