Может ли объект удалить себя? Как?

Я пытаюсь написать простую игру в мяч, и есть несколько поворотов (т. е., ball lives). Мяч "умирает", когда он проходит нижнюю границу экрана. То, что у меня есть до сих пор, работает, но, похоже, не является правильным способом делать вещи:

if (ball.getY() > bottomOfScreen) {
  ball.die();
  remove(ball);
}

метод die () в основном медленно выцветает цвет шара(dark_gray -> pause(50) - > light_gray -> pause (50)), но на самом деле ничего полезного не делает.

remove (), очевидно, избавляется от шара с экрана, именно этого я и хочу. Для меня имеет смысл, чтобы это remove() было частью метода die () шара, в отличие от отдельного вызова метода в основной программе, но я не уверен, как это сделать?

может ли объект удалить себя? И если может, то лучше ли объектное самоубийство, чем объектное убийство, с философско-методологической точки зрения?

спасибо!

5 ответов


объект может удалить себя, если он имеет некоторую ссылку на механизм визуализации представления. Ваш образец не дает достаточной информации, поэтому я приведу пример одного из способов сделать это:

public class Ball {
    private ViewRenderer view;

    public void remove() {
       view.remove(this);
    }
}

ни суицид, ни убийство лучше или хуже. Это зависит от вашего дизайна и требований.

в этом примере, однако,убийство может быть желательно так как этот путь Ball объект не нужно знать, в каком контексте он используется.


можно создать метод, при котором шар удаляется сам, но это плохо. Чтобы удалить себя с экрана, шар должен иметь ссылку на экран. Это создает круговую цепочку ссылок (мяч имеет ссылку на экран, Экран имеет ссылку на мяч), что сделает ваш дизайн более сложным, а ваше тестирование намного сложнее.

самоубийство в порядке-экран говорит мячу умереть, и мяч умирает. Но это о разрыве отношений, а не о смерти. Вещь, поддерживающая отношения, - это экран, и поэтому это должно быть то, что делает удаление.

также помните, что эти два не обязательно должны происходить вместе. По какой-то причине экран может захотеть сохранить мертвый шар, и он может захотеть удалить шар, который не мертв. Даже если это не произойдет в вашем приложении прямо сейчас, учитывайте эту возможность.


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

Что вы можете сделать, это удалить объект из коллекций, содержащих его, но для этого потребуется, чтобы объект имел доступ к этим коллекциям (что в большинстве случаев было бы невозможно, так как может быть много коллекций).

Я бы предложил содержащий объект (экран в вашем случае) для опроса содержащегося объекта (мяч) состояние и удалить его после того, как он на самом деле мертв.


предположительно существует какой-то объект (например, экран или ViewRenderer в Примере Йохана), который содержит ссылку на шар, и удаление этой ссылки должно быть сделано экраном ("убийство объекта"). "Самоубийство объекта" равносильно передаче сообщения на экран с просьбой "убить".

поскольку это шар, который знает, когда он прошел границу, для меня имеет смысл (не зная деталей вашего дизайна) для удаления, которое будет инициировано шаром. Затем экран может узнать об этом изменении одним из нескольких способов:

  • экран может опросить мяч.
  • мяч может содержать прямую обратную ссылку на экран, что создает неудачную круговую зависимость.
  • мяч может содержать ссылку на экран с помощью BallObserver интерфейс. Это приложение шаблон Observer.

первый-простой, и это делает его хорошим выбором, если он подходит естественно, в ваш механизм для рисования экрана. Третий в принципе более гибкий, но на практике эта гибкость может и не понадобиться. Средний вариант может быть в порядке, в простой программе, но вы, вероятно, следует рассматривать как шаг на пути к третьей.

и если не есть экран (или ViewRenderer, или что-то еще) объект и действительно означает "отдельный вызов метода в основной программе", то вы, вероятно, должны пересмотреть свой дизайн.


нет, объекты не самоубийство. Любая ссылка сама по себе является лишь ссылкой.

чтобы "очистить" объект внутри себя, нужно просто очистить все переменные экземпляра.

чтобы "очистить" объект вне себя, нужно установить переменную равной null.