Java-класс уничтожить это еще один класс - PullRequest
0 голосов
/ 19 января 2019

Я кодировал свой проект AI в Java, когда столкнулся с этой проблемой. Сначала я создаю среду какой-то игры, используя класс «Пастбище». Затем интеллектуальный агент, который написан в классе «Пастух», задает некоторые вопросы из класса «Пастбище», используя его общедоступный интерфейс, а затем перемещается на основе результатов. Теперь, когда выполняются определенные условия, игра заканчивается, и я могу просто напечатать счет и затем вызвать System.exit (0), чтобы завершить программу. Но я хочу начать новую игру, когда игра заканчивается, а не просто завершить всю программу. Теперь мне нужно уничтожить класс «Пастух», чтобы закончить действия агента, а затем начать новую игру. Я знаю, что у классов Java есть деструкторы. Вопрос в том: я могу вызвать деструктор другого java-класса (в данном случае класса «Пастух») внутри другого класса (в данном случае класса «Pasture»)? и как я могу написать метод деструктора? Какой синтаксис?

Спасибо всем. Я понял. Я был неправ насчет деструкторов. Я просто подумал, что, как и c ++, в Java также есть деструкторы.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Теперь мне нужно уничтожить класс "Пастух", чтобы завершить действия агента, а затем начать новую игру.Я знаю, что у классов Java есть деструкторы.

Вы неправильно поняли нечто довольно фундаментальное:

  1. В Java нет деструкторов.Вы можете путать деструкторы с финализаторами.Это методы, которые вызываются после , когда GC решил удалить объект.(Это чрезмерное упрощение ... но в действительности дело в том, что финализаторы не имеют отношения к этой проблеме. На самом деле, очень мало случаев, когда финализаторы актуальны.)

  2. Вы можете 'т уничтожить объекты.Объекты уничтожаются сборщиком мусора, когда они больше не нужны.Более конкретно, они уничтожаются, когда они недоступны;то есть когда они больше не могут влиять на выполнение программы.

Так что вы делаете?

Прежде всего, забудьте о «уничтожении» объектов.Вместо этого подумайте, как подготовить к следующей игре.Существует два подхода.

  1. Вы можете реализовать reset() или аналогичный метод для всех «игровых» объектов, которые необходимо сбросить / повторно инициализировать при запуске новой игры.

  2. Вы можете просто уронить все соответствующие «игровые» объекты на пол и создать новые.(GC позаботится о мусоре.)

Или вы можете использовать комбинацию двух подходов;например, сбросьте Pasture объект в его начальное состояние и сбросьте / воссоздайте Shepard, Sheep и т. д.

0 голосов
/ 19 января 2019

В Java нет деструкторов, которые вы можете запрограммировать или вызвать. Чтобы сообщить сборщику мусора, что вы больше не используете объект, вы можете установить для него значение null

myObject = null;

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

myObject.closeResources();
myObject = null;

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

public class MyClass {
    public MyClass() {
        this.reset();
    }
}

MyClass myObject = new MyClass();
...

myObject.reset();
...