Есть ли причина, по которой вы не должны создавать класс, содержащий ссылку на другой класс как поле (и стоит ли это делать в любом случае)? - PullRequest
0 голосов
/ 18 сентября 2018

Я работаю над простой игрой в java, где юнитами являются классы с их именами, состоянием здоровья и т. Д., Хранящимися в полях.Единицы считываются из файла и затем сохраняются в хэш-карте для формирования мастер-библиотеки, которая используется в качестве справочной информации при появлении новых единиц.

Я пытаюсь решить, как хранить фактические единицы вигра (не базовая единица, используемая в качестве ориентира, а действительные единицы, перемещающиеся по карте).Фактические единицы содержат больше данных, чем ссылки, такие как текущее состояние здоровья, бустеры и т. Д., Но им все еще необходимо иметь доступ к исходным характеристикам, таким как максимальное состояние здоровья и тому подобное.Мне кажется излишним, чтобы каждый экземпляр юнита носил с собой кучу неизменной информации, которая уже хранится в справочнике, поэтому я думаю о том, чтобы создать еще один класс для представления порожденных юнитов, который содержит такие данные, как текущее состояние,и т.д., а также ссылка на ссылочный класс, чтобы он все еще имел доступ к основным данным.Код будет выглядеть примерно так (это всего лишь тестовый код, который я использую для проверки концепции; впервые в 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.

1 Ответ

0 голосов
/ 18 сентября 2018

Вот несколько предложений:

  1. соблюдайте соглашения по именованию Java.
  2. В своем конструкторе класса объектов вы присвоили себе переменную (this.UnitCurrentHealth = UnitCurrentHealth;), изменив ее на this.UnitCurrentHealth = CurrentHealth;
  3. Вы используете статический внутренний класс без необходимости, поскольку у вашего внешнего класса нет никаких других закрытых полей или методов, требуемых вашими внутренними классами. Если вы делаете это потому, что хотите сгруппировать их, используйте пакеты для их группировки и переместите каждый класс в отдельный файл.
  4. Вы сказали, что вы новичок в Java, а пока сосредоточены на функциях Java. Как только вы почувствуете себя достаточно уверенно, погрузитесь в «Шаблоны проектирования».

Спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...