我正在使用Java编写一个游戏,正如问题标题所示,我在我的类中使用公共字段。(暂时如此)
从我所看到的,公共字段是不好的,我也有一些理解为什么。(但如果有人能澄清为什么不应该使用它们,那将不胜感激)
问题在于,也从我所看到的(并且似乎很合理)是,使用私有字段,但使用getter和setter访问它们也不好,因为这违反了使用私有字段的初衷。
那么,我的问题是,有什么替代方案吗?或者我真的必须使用带有getter和setter的私有字段吗?
以下是其中一个类及其部分方法的参考。
如有需要,我可以进行更详细的说明。
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;
}
}
编辑:为了检查目的,这是我的Weapon
类现在的样子:(代码示例出现问题,因此看起来不正确。)
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;
}
你可以看到,由于Weapon
的DAMAGE
和SPEED
不需要更改,它们可以暂时使用final关键字。 (如果在游戏后期决定升级这些值,可以添加带验证的setter方法,或者创建一个新的具有升级值的武器)。这些值在Weapon
构造函数中设置。
总之,当需要时并且明智地使用时,getter和setter是可以的。(但是)
java
标签中的大多数人。 (顺便说一句,我的发现也很偶然。)正如我所说,这是Java团队发明的一些东西,并且遗憾的是已经扩散到了C#中。一些人认为通过添加公共属性而不是公共数据成员实现了纯面向对象编程。如果你是在c++
标签下发帖,“大多数人”应该会同意我的观点。(至少我希望如此。) - sbi