重置java中的每个变量

时间:2014-05-08 15:17:54

标签: java

有没有办法将静态变量的值重置为初始状态?例如:

我有很多变量,它们包含分数,速度等。所有这些变量在程序执行期间都在变化。因此,当用户在游戏中失败时,我想将所有变量重置为其初始状态。有什么办法吗?因为我不知道在我的程序中为EACH变量手动执行此操作是否是个好主意。例如:

static int SCORE = 0;
static float SPEED = 2.3f;



public void resetGame() {

SCORE = 0;
SPEED = 2.3;

}

8 个答案:

答案 0 :(得分:14)

使用对象,并在构造函数中设置其初始状态:

public class GameSettings {
    private int score = 0;
    private float speed = 2.3F;

    // methods omitted for brevity
}

...

public void resetGame() {
    gameSettings = new GameSettings();
}

另外,请尊重Java命名约定。 ALL_CAPS保留给常量。变量应该是lowerCase。

答案 1 :(得分:3)

存储默认值。

static final int DEFAULT_SCORE = 0;
static final float DEFAULT_SPEED =2.3;

static int SCORE = DEFAULT_SCORE;
static float SPEED = DEFAULT_SPEED;

public static void resetGame() {
    SCORE = DEFAULT_SCORE;
    SPEED = DEFAULT_SPEED;
}

答案 2 :(得分:2)

为什么不重新创建对象,如果你想重置它?然后它隐含地具有默认值。

答案 3 :(得分:1)

您可以只声明没有值的变量,并使用方法initGamestate()将所有变量设置为初始值。在应用程序初始化和用户启动新游戏时调用此函数。

更面向对象的解决方案是使class GameState具有所有这些变量并在其构造函数中设置默认值。然后,您可以通过使用new GameState();

初始化新对象来开始每个游戏

答案 4 :(得分:0)

你只需要逐个重置它们。如果您担心拼写错误,可以执行:int initialscore = 0; int score = initialscore;,然后将其重置为函数中的initial...变量。

答案 5 :(得分:0)

  

我有很多变量,包括分数,速度等

您应该将它们全部放入一个类中,并且每个成员都会被初始化(如果默认值不起作用)。 您将在一个对该类对象的引用中保持玩家的状态。要重置,只需创建此类的新对象并将其分配给引用。

答案 6 :(得分:0)

通常游戏使用多个线程(例如,当使用Swing或绘制任何图形时),例如所以输入不会被阻止。这意味着使用所有其他解决方案,您可能会遇到竞争条件。这solution of Evan Knowles最接近。

我建议使用不可变的GameState类,例如

public GameState {
  private final int score;
  private final int speed;

  // initial state/"reset game"
  public GameState() {
    score = 0;
    speed = 2.3;
  }
  // Private so we are always in a valid state
  private GameState(int _score, int _speed) {
     score = _score;
     speed = _speed;
  }

  public GameState updateSpeed(int _speed) { return new GameState(this.score, _speed); }
  public GameState updateScore(int _score) { return new GameState(_score, this.speed); }

  public int getSpeed() { return speed;}
  public int getScore() { return score;}


  // add getters, setters and whatsoever here. But watch for proper synchronization between threads!
}

这里的优点是,一旦分配了值,就不能再从外部更改它们("不可变" /只读),因此不存在并发问题。另外,你可以免费获得一种chaing(见下文)!此外,您可以安全地(取消)序列化游戏状态以保存/加载游戏。

实际上,每个GameState代表finite state machine中的一个州。调用updateSpeed或updateScore是向新状态的转换。 公共默认构造函数是到状态机初始状态的转换。 另一方面,状态机是有限的,因为得分和速度的值范围是有限的,因此它们的所有组合都会导致有限的状态。

我现在假设你做其他游戏的课程称为Game

public Game {
  private volatile GameState gameState = new GameState();
  public void resetGame() {
    gameState = new GameState();
  }
  // Just an example
  public increaseSpeed(int _additionalSpeed) {
    gameState = gameState.updateSpeed(gameState.getSpeed() + _additionalSpeed);
  }

  // Change more than one value
  public changeBoth(int _newSpeed, int _newScore) {
    // First way: Create a new GameState, change both values step by step and then assign afterwards.
    GameState _newState = gameState.updateScore(_newScore);
    // other computations follow
    // Do NOT assign to gameSpate here, because the state would be inconsistent then.  
    _newState = _newState.updateSpeed(_newSpeed);
    // At the END of the method, assign the new game state. That ensures that the state is always valid
    gameState = _newState;

    // Second way: Use method chaining if you don't need to make other computations in between. Again, do this at the end of the method
    gameState = gameState.updateScore(_newScore).updateSpeed(_newSpeed);
  }

}

volatile关键字确保每个线程都看到gameState变量的相同值。您也可以考虑使用其他同步/锁定技术。或者,您可以将gameState字段设为静态,如果只有一个Game对象,则跳过volatile关键字。 因为GameState是不可变的(只读),所以现在游戏的状态始终是一致/有效的。

答案 7 :(得分:-1)

一种好方法是使用静态init()并在发生异常时调用它。

package com.kvvssut.misc;

public class ResetStatic {

    private static int SCORE = 0;
    private static float SPEED = 2.3f; 

    private static void init() {
        SCORE = 0;
        SPEED = 2.3f;       
    }



    public static void main(String[] args) {

        SCORE = 100;
        SPEED = 230.3f;

        try {
            throw new RuntimeException();
        } catch (Exception e) {
            init();
        }

        System.out.println(SCORE);
        System.out.println(SPEED);
    }

}