首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除对象以释放内存JAVA

删除对象以释放内存JAVA
EN

Stack Overflow用户
提问于 2020-09-04 12:00:30
回答 1查看 509关注 0票数 1

我正在开发一个小型太空射击游戏。这是学习JAVA的一种有趣的方法,我想确保我做的事情是正确的。这个物体(船)在运行时(激光)产生其他物体。( ->激光器船)。

我用这种方式实现了:

  • 对象工具在屏幕上绘制。当检测到触摸时,它将创建class.
  • GameScreen类的新的实例,然后将它们添加到GameScreen GameScreen对象内部的静态LinkedList激光器中,负责绘制和更新屏幕上的所有激光、船只和效果。

不言自明。但现在:

  • detectCollision()被调用,所有与船对象相交的激光都被从LinkedList激光器中删除。游戏结束时的
  • (用户退出)我迭代了存储在GameScreen.lasers链接列表中的激光类的所有实例,并将它们全部设置为空。完成后,我还将列表设置为null.

这是释放分配内存的正确方式吗?

激光创造:

代码语言:javascript
运行
复制
abstract class Ship {
if (canShoot()) {
    Laser laser = new Laser(new Rectangle(x, y, width, height)); // bounds
    GameScreen.playerLasers.add(laser);
}}

激光处理:

代码语言:javascript
运行
复制
public class GameScreen {
private void dispose() {
    for (Laser laser : playerLasers) {
        laser.bounds = null;
        laser = null;
    }
    playerLasers = null;
}}

GameScreen类collisionDetection():

代码语言:javascript
运行
复制
public class GameScreen {
    private void detectCollision() {
        ListIterator<Laser> itr = playerLasers.listIterator();
        while (itr.hasNext()){
            Laser laser = itr.next();
            if (laser.bounds.overlaps(ship.bounds)){
                ship.health -= laser.damage;
                laser.bounds = null;
                laser = null;
                itr.remove();
}}}}
EN

回答 1

Stack Overflow用户

发布于 2020-09-04 12:05:00

事实并非如此。

Java是一个垃圾收集系统。你不能“交易”。将一些东西设置为null不会使事物释放。

Java将自动清理任何需要的东西,并且您不需要做任何事情来实现这一点。您唯一需要担心的是编程逻辑。例如,在本例中,您确实需要itr.remove();调用--这不是要释放一个激光对象,而是要从游戏逻辑中删除激光拍摄。因此,删除空分配行,您将得到以下结果:

代码语言:javascript
运行
复制
if (laser.bounds.overlaps(ship.bounds)){
                ship.health -= laser.damage;
                itr.remove();
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63740797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档