Если вы видите в классе X
reference to object
вместо указателей, X
может быть приятно думать, что объект local
. Это где-то в стеке. X
не нужно думать о его разрушении definitely
. С указателями объект будет находиться в куче. Программист (и особенно сторонник X
) может запутаться в том, кто освободит этот указатель. Итак, спокойствие со ссылками. Эта точка действительна при сравнении reference-to-object-on-heap
и pointer-to-object-on-stack
.
Наступает другая проблема, dangling references and dangling pointers
.
Поскольку любой может вызвать удаление указателя из любого места, трудно найти фактическую причину оборванных указателей. Не с болтающимися ссылками. Поскольку этот объект будет уничтожен, когда он выйдет из стека, в коде есть только одно место, где это может произойти (именно там был создан этот объект). Итак, легче найти проблему.
Если у вас есть болтливая ссылка, в дизайне что-то не так. Поскольку вы храните объект Y
в ссылке X
. X
использует Y
. Однако время жизни X
больше, чем Y
. Это может произойти, когда Y
является локальным, а X
является глобальным. Это противоречит интуиции, потому что, если бы в стеке вы сохранили ссылку на объект верхнего стека в объекте lower-stack-object. Но с оборванными указателями может быть неправильная ошибка логики или несоответствие владения. Итак, если проблема, такая как оборванная ссылка, может быть исправлена с лучшим дизайном.
Однако, если мы храним объект в куче в качестве ссылки, было бы трудно найти проблему с обвязывающей ссылкой снова.
Итак, мой приоритет будет:
references to stack object > references to heap object > pointers.
Глядя на ваш код и гадать: EventBusDemo
, как какую-то глобальную шина, которая хранит регистрационный-обработчик, который будет называться. Здесь это один объект, и с течением времени вы будете давать ему разные playerMoveReg
. Таким образом, это указатель.
PlayerMoveEvent
похоже, что он был бы обработан в ближайшее время, так как это Event
. Вы должны создать новый PlayerMoveEvent
для нового события. Итак, вы хотите сделать player
указателем или ссылкой. Вы хотите изменить player
в случае (даже по ошибке)? Точно нет. Вы хотите какой-то ум? Определенно да. Итак, используйте ссылку.
Объект, на который ссылается объект, может быть изменен? player.setX (п); изменит этот объект, переданный по ссылке (в конструкторе PlayMoveEvent)? –
@ JakeM обновил код, чтобы уточнить, что происходит с эталонным объектом. Вы не можете изменить точку отсчета, но вы можете изменить значения внутри этой ссылки. –