¿Cuáles son las alternativas a los campos públicos?

Estoy programando un juego en Java, y como el título de la pregunta sugiere, estoy usando campos públicos en mis clases. (Siendo por el momento)

Por lo que he visto, los campos públicos son malos y entiendo por qué. (pero si alguien pudiera aclarar por qué no debe usarlos, se agradecería)

Lo que pasa es que también por lo que he visto, (y parece lógico) es que usar campos privados, pero usar getters y setters para acceder a ellos tampoco es bueno, ya que en primer lugar no sirve para nada.

Entonces, mi pregunta es, ¿cuáles son las alternativas? ¿o realmente tengo que usar campos privados con getters y setters?

Para referencia aquí es una de mis clases, y algunos de sus métodos.

Elaboraré más si es necesario.

public double health;
//The player's fields.
public String name;
public double goldCount;
public double maxWeight;
public double currentWeight;
public double maxBackPckSlts;
public double usedBackPckSlts; // The current back pack slots in use
public double maxHealth; // Maximum amount of health
public ArrayList<String> backPack = new ArrayList<String>();

//This method happens when ever the player dynamically takes damage(i.e. when it is not scripted for the player to take damage.
//Parameters will be added to make it dynamic so the player can take any spread of damage.
public void beDamaged(double damage)
{
    this.health -= damage;
    if (this.health < 0)
    {
        this.health = 0;
    }
}

EDITAR: Para fines de verificación, esto es lo que miWeapon La clase se ve ahora: (El ejemplo de código no funciona por alguna razón, por lo que no se ve bien).

private final double DAMAGE;
private final double SPEED;

public Weapon(double initialDmg,double initialSpd,String startName,double initialWg)
{
    DAMAGE = initialDmg;
    SPEED = initialSpd;
    setItemName(startName);
    setItemWeight(initialWg);
}

public double getSpeed() 
{
    return SPEED;
}


public double getDamage()
{
    return DAMAGE;
}

Como puedes ver, como elWeapon's DAMAGE ySPEED no necesitan ser cambiados, pueden ser finales por el momento. (si, más adelante en el juego, decidí que estos valores se pueden "actualizar", por así decirlo, puedo agregar setters luego, con validación, o simplemente hacer una nueva arma con los valores actualizados) Se establecen en elWeapon's constructor.

Conclusión: getters y setters están bien, siempre que se usen de manera inteligente y solo se usen cuando sea necesario. (sin embargo)

Respuestas a la pregunta(12)

Su respuesta a la pregunta