Как написать на 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
.
Неплохо!
В конце поменял (чтоб дубликат не делать):
/*
* Идеальный способ создания запутанного имени метода, sizeof и sizeOf
* Этот метод использует константу SIZE из класса-оболочки
*/
public static int sizeOf(Class dataType) {
return sizeof(dataType);
}
}