Java 你有什么理由不';不要将一个包含对另一个类的引用的类作为一个字段(这样做是否值得)?

Java 你有什么理由不';不要将一个包含对另一个类的引用的类作为一个字段(这样做是否值得)?,java,class,memory,reference,Java,Class,Memory,Reference,我正在用java开发一个简单的游戏,其中的单位是类,它们的名称、运行状况等存储在字段中。这些单位从文件中读入,然后存储在hashmap中,形成一个主库,在生成新单位时用作参考 我试图决定如何在游戏中存储实际单位(不是用作参考的基本单位,而是在地图上移动的实际单位)。实际单位包含的数据比参考数据多,如当前生命值、助推器等,但它们仍然需要访问原始统计数据,如最大生命值等。对我来说,让一个单位的每个实例携带一堆已经存储在引用中的不变信息似乎是多余的,所以我想做的是创建另一个类来表示包含当前健康等数据的

我正在用java开发一个简单的游戏,其中的单位是类,它们的名称、运行状况等存储在字段中。这些单位从文件中读入,然后存储在hashmap中,形成一个主库,在生成新单位时用作参考

我试图决定如何在游戏中存储实际单位(不是用作参考的基本单位,而是在地图上移动的实际单位)。实际单位包含的数据比参考数据多,如当前生命值、助推器等,但它们仍然需要访问原始统计数据,如最大生命值等。对我来说,让一个单位的每个实例携带一堆已经存储在引用中的不变信息似乎是多余的,所以我想做的是创建另一个类来表示包含当前健康等数据的衍生单位,以及对引用类的引用,以便它仍然可以访问基本数据。代码看起来像这样(这只是我用来测试这个概念的测试代码;对java来说是新的):

`//代码开头

public class UnitTest
{
// Main test function.
public static void main(String[] args)
{
    System.out.println("\nStarting test.\n\n");

    ObjectDefinitions.UnitArchetype Base = new     ObjectDefinitions.UnitArchetype("Soldier", 0.8f);
    ObjectDefinitions.Unit Product = new ObjectDefinitions.Unit(Base, 9.0f);

    Base.UnitArchetypeStats();
    Product.UnitStats();

    Base.SetUnitMaxHealth(11.0f);

    Base.UnitArchetypeStats();
    Product.UnitStats();

}
}


class ObjectDefinitions
{
static class UnitArchetype
{
    // Fields
    private String UnitType;
    private float UnitMaxHealth;


    // Constructor
    UnitArchetype(String UnitType, float UnitMaxHealth)
    {

        this.UnitType = UnitType;
        this.UnitMaxHealth = UnitMaxHealth;

    }

    // Methods
    public void UnitArchetypeStats()
    {
        System.out.println("UnitType: " + UnitType + "\nUnitMaxHealth: " + UnitMaxHealth + "\n");

    }

    public void SetUnitMaxHealth(float Health)
    {
        UnitMaxHealth = Health;
    }
}



static class Unit
{
    // Fields
        private ObjectDefinitions.UnitArchetype BaseUnit; // the reference to the base unit
        private float UnitCurrentHealth;

    // Constructor
    Unit(ObjectDefinitions.UnitArchetype Model, float CurrentHealth)
    {
        this.BaseUnit = Model;
        this.UnitCurrentHealth = UnitCurrentHealth;
    }

    // Methods
    public void UnitStats()
    {
        System.out.println("UnitType: " + BaseUnit.UnitType + "\nUnitMaxHealth: " + BaseUnit.UnitMaxHealth + "\nUnitCurrentHealth: " + UnitCurrentHealth + "\n");

    }
}




}
所以我有两个问题。首先,以这种方式链接到基本单元会不会工作而不会引起任何问题,或者容易破坏代码中的某些内容


第二,这样的事情值得我费心吗,还是我应该通过添加额外的字段来扩展引用类,然后在每次生成新单位时克隆所有信息,这样每个游戏中的单位都包含所有信息?我试图优化内存,但老实说,即使有额外的当前健康和其他信息字段,生成的单位仍然只有十几个字段。这样的调整值得费心吗?我来自python背景,在写这篇文章的过程中学习了java,所以我真的不太了解java中什么是“重”的

  • 遵循java命名约定
  • 在单元类构造函数中,您已经为自身分配了一个变量(
    this.UnitCurrentHealth=UnitCurrentHealth;
    )将其更改为
    this.UnitCurrentHealth=CurrentHealth
  • 不必要地使用静态内部类,因为外部类没有内部类所需的其他私有字段或方法。如果您这样做是因为您想对它们进行分组,那么可以使用包对它们进行分组,并将每个类移动到它自己的文件中
  • 您说过,您是java新手,现在主要关注java特性。一旦你有足够的信心,那么就进入“设计模式”吧

  • 谢谢:)

    注意java namaing约定。方法名和变量名应该以小写字符开头不知道你的意思,但如果我是你,我不会使用静态内部类,而是单独的类我没有阅读你的全文,但基于你的标题,在某些情况下,需要将另一个类的和对象包含为类字段,并扩展另一个类而不是使用其obj。它的Has-A vs-Is-A继承类型。@Jens如果它不是我正在协作的代码,或者只是约定的,它会有什么不同吗?它会影响编译还是什么?@Stultuske所以只需在脚本级别定义每个类,而不是作为嵌套类的一部分?谢谢。我只是开始使用java,因为python对于我正在尝试做的事情来说太慢了,而且这是一个非常好的学习过程。