Какие есть альтернативы публичным полям? - PullRequest
13 голосов
/ 01 января 2011

Я программирую игру на Java, и в качестве подсказки для названия вопроса я использую открытые поля в своих классах. (пока)

Из того, что я видел, публичные поля плохие, и я понимаю, почему. (но если кто-то может уточнить, почему вы не должны их использовать, это будет оценено)

Дело в том, что из того, что я видел (и это кажется логичным), является то, что использование приватных полей, но использование методов получения и установки для их получения также не очень хорошо, так как это побеждает смысл использования закрытых полей в первом место.

Итак, мой вопрос: каковы альтернативы? или мне действительно нужно использовать приватные поля с геттерами и сеттерами?

Для справки приведу один из моих классов и некоторые его методы.

Я уточню больше, если потребуется.

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's DAMAGE и SPEED не нужно менять, они могут быть окончательными на данный момент. (если позже в игре я решил, что эти значения можно «обновить», я могу добавить сеттеры затем с проверкой или просто создать новое оружие с улучшенными значениями) Они устанавливаются в конструкторе Weapon's .

Вывод: геттеры и сеттеры в порядке, если они используются грамотно и используются только при необходимости. (Однако)

Ответы [ 12 ]

0 голосов
/ 01 января 2011

Одно преимущество, еще не упомянутое во избежание открытых полей: если нет открытых полей, можно определить интерфейс, который включает в себя все общедоступные функции класса, сделать так, чтобы класс реализовал этот интерфейс, а затем использовать все, что использует вместо этого класс использует интерфейс. Если это будет сделано, позже можно разработать класс, который имеет совершенно разные методы и поля, но который реализует тот же интерфейс, и использовать этот класс взаимозаменяемо с оригиналом. Если это сделано, может быть полезно, чтобы класс реализовал статический метод фабрики в дополнение к конструктору, и чтобы фабрика возвращала объект типа интерфейса. Это позволит более поздним версиям фабрики возвращать объект какого-либо другого типа. Например, можно придумать недорогую версию объекта, в которой многие свойства возвращают константы; фабрика могла увидеть, подойдет ли такой объект, и если да, вернуть его вместо обычного объекта.

Кстати, концепция использования смеси постоянных и изменчивых объектов в приключении восходит по крайней мере к 1980 году. В патроне Уоррена Робинета «Приключение» для 2600 года каждый объект имеет ряд указателей, хранящихся в ПЗУ для таких вещей, как положение и состояние, поэтому объектам, которые не будут перемещаться (например, ворота замка или «подпись»), не нужно сохранять свою позицию в ОЗУ и большинство захватываемых объектов (которые не имеют никакого другого состояния, кроме чем их положение) не нужно хранить состояние в ОЗУ, но анимированные объекты, такие как драконы и летучая мышь, могут хранить как состояние, так и положение в ОЗУ. На машине с 128 байтами ОЗУ такая экономия была критической.

0 голосов
/ 01 января 2011

.... жалкое содержание опущено ....

EDIT

извините за то, что вы слишком жалки - должны быть таблетки ... Другие ответы весьма актуальны и хороши

...