Может ли объект удалить себя?Как? - PullRequest
8 голосов
/ 01 сентября 2011

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

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

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

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

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

Спасибо!

Ответы [ 5 ]

5 голосов
/ 01 сентября 2011

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

public class Ball {
    private ViewRenderer view;

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

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

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

3 голосов
/ 01 сентября 2011

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

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

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

2 голосов
/ 01 сентября 2011

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

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

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

1 голос
/ 01 сентября 2011

Предположительно, существует некоторый объект (например, Screen или ViewRenderer в примере Йохана), который содержит ссылку на Шар, и удаление этой ссылки должно быть сделано Screen («убийство объекта»).«Самоубийство объекта» означает, что Болл передает сообщение на экран с просьбой «убить».

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

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

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

И если у вас нет , у вас нет экрана (илиViewRenderer или любой другой) объект и действительно означает «отдельный вызов метода в основной программе», тогда вам, вероятно, следует пересмотреть свой дизайн.

0 голосов
/ 20 января 2015

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

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

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

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