Если вы только начинаете изучать 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
.
Читайте также:
- Метрики для улучшения архитектуры ПО
- Java 17: что нового по сравнению с Java 11
- 9 вещей, которыми следует заняться Java программисту в 2018 году
Читайте нас в Telegram, VK и Дзен
Перевод статьи javinpaul: How to Write a C-like sizeof Function in Java