Java Примитивная Реализация - PullRequest
6 голосов
/ 12 марта 2011

Java имеет объектную, целочисленную и примитивную версии int базовых типов.

Примитивные версии быстрее / легче / и т. Д.в общем, вы должны их использовать.

Мне интересно, почему разработчики Java не только имеют типы объектов и используют примитивные версии для оптимизации за кулисами.

Итак:

Integer foo(Integer alpha)
{
    Integer total = 0;
    for(Integer counter = 0; counter < alpha; counter++)
    {
        total += counter;
    }
    return total;
}

Будет скомпилирован в код, подобный следующему:

int foo(int alpha)
{
    int total = 0;
    for(int counter = 0; counter < alpha; counter++)
    {
        total += counter;
    }
    return total;
}

По сути, этот гипотетический Java-компилятор преобразует экземпляры Integer, Double, Float и т. Д. В эквивалентные примитивные типы.Только в тех случаях, когда объекты действительно необходимы (скажем, для помещения элемента в контейнер), будут задействованы фактические объекты Integer.

ПРИМЕЧАНИЕ: в приведенном выше коде используются операторы для объектов Integer, которыеЯ знаю, что на самом деле не разрешено.Поскольку я изобретаю гипотетические компиляторы Java, я притворюсь, что у этого есть специальный корпус для Integer / Float / Double, как для String.

Ответы [ 2 ]

5 голосов
/ 12 марта 2011

Что меня интересует, так это то, что разработчики Java не только имеют типы объектов и используют примитивные версии для оптимизации за кулисами.

Чтобы понять причины, стоящие заРешения по проектированию Java, вам необходимо понимать исторический контекст, в котором они были приняты.

Сильное различие между примитивными типами и ссылочными типами было заложено в дизайн языка до JDK 1.0.До JDK 1.5 это все, что было: если вы хотите поместить целые числа в коллекции (например), вы явно использовали Integer.valueOf(int) и т. Д.

Когда к типу был добавлен auto-boxing / auto-unboxingСистема в JDK 1.5, это должно было быть сделано способом, обратно совместимым.То, что они придумали, - это хороший компромисс ... но не то, чего бы они могли / могли бы достичь, если бы начали с чистого листа.

(И причина, по которой они этого не сделали / не смогли "сделать это правильно "в первый раз ... в начале 1990-х годов, вероятно, это было связано с оригинальным языковым охватом и временем, которое они испытывали, чтобы выпустить первый релиз. Если бы они потратили дополнительные месяцы / годы, пытаясь получить егоДа, есть вероятность, что проект был бы убит ... или что окно маркетинга закрылось бы.)

0 голосов
/ 12 марта 2011

Вам нужен какой-то способ сообщить компилятору, что вы хотите коробочную версию, верно? Иначе как бы он узнал, нужна ли вам версия со свойствами или примитивная версия? Что происходит, когда вы передаете ваш Integer методу, который оценивает Integer.MAX_VALUE?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...