2013-07-23 2 views
-1

У меня есть класс, который состоял из следующих примитивных только типов:Размер объекта Java, который содержит только примитивные типы

public class Test{ 

private int a1; //size of int =4 
private long a2; //size of long = 8 
private double a3[]; //size of double =8 

} 

Кроме того, у меня есть объект для этого класса, как это:

Test test= new Test(1,3,new double[] {0.1, 0.2, 0.3, 0.4}); 

Я хотел бы иметь функцию, которая будет найти размер этого объекта, и в этом случае она будет возвращать 4 + 8 + 4 * 8 = 44.

+0

Меня не интересует общий размер объекта, но только при общем размере используемых примитивных переменных, как показано в приведенном примере. –

+0

Затем ... http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html –

+0

http://btoddb-java-sizing.blogspot.com/ для размеров на 64-битной JVM; 32-разрядная JVM использует 4-байтовое выравнивание памяти вместо 8-байтового выравнивания памяти, поэтому ints и floats будут занимать 4 байта вместо 8 –

ответ

1

Если я понять вопрос правильно, то что нибудь вы могли бы легко реализовать себя, но здесь мы идем:

public class Test { 
    private int a1; 
    private long a2; 
    private double a3[]; 

    public Test(final int a1, final long a2, final double[] a3) { 
     this.a1 = a1; 
     this.a2 = a2; 
     this.a3 = a3; 
    } 

    public int getSize() { 
     return 4 + 8 + (a3.length * 8); 
    } 
} 

Также несколько заметок:

  • Воздержитесь от использования Test, как имя класса, вы должны использовать что-то вроде SizeTest или что-то, а просто тест будет в конечном счете, приведет к хаосу, если вы решите провести его тестирование или что-то еще.
  • Дать переменные значимые имена. Если бы у меня была oppurtunity, я бы сделал это, но я действительно не могу ничего сделать из текущих имен.

Если вы ищете родовую функцию, то хорошо все получится намного сложнее, в этом случае вы будете искать метод с последующей подписью: SizeTester.getSize(Object object);, это все еще выполнимо, но вам нужно будет используйте Reflection, чтобы получить информацию о полях, и вы должны использовать это, если это абсолютно необходимо.

+0

Спасибо за ваш ответ, но, очевидно, я ищу общую функцию. –

+0

Наконец, я вычисляю размер вручную с помощью hashMap, где я храню разные размеры для каждого типа и, кроме того, array.length * type_size для размера массива. Еще раз спасибо. –