Эквивалент #define в Java для макросов - PullRequest
3 голосов
/ 08 июня 2011

Мой вопрос близок к этому , но не совсем так.

У меня есть унаследованный (как, я не могу / не буду изменять его) массив параметров в моем классе, например:

public double[] params;

Класс использует эти параметры сложным образом, поэтому я бы предпочел иметь удобочитаемые имена для каждого элемента в массиве. В C вы бы сделали что-то вроде этого

#define MY_READABLE_PARAMETER params[0]

Мне также известно, что в Java я мог бы создать группу констант или перечислитель с атрибутами. Затем, чтобы получить доступ к параметру, я должен набрать что-то вроде этого:

params[MY_READABLE_PARAMETER]

Это приемлемо, но я действительно хотел бы вообще пропустить имя массива. Возможно ли это?

Ответы [ 4 ]

3 голосов
/ 08 июня 2011

С Enum:

enum Param {
    AGE(0);
    WEIGHT(1);
    ...

    private int arrayIndex;
    // Constructor
    Param(int index) {
        arrayIndex = index;
    }

    public double getValue(double[] params) {
        return params[arrayIndex];
    }
}

и вы используете его как таковое

double age = Param.AGE.getValue(params);

Не думаю, что это лучше, чем другие предложения, но я хотел показать, как это сделать с ENUM.

3 голосов
/ 08 июня 2011

Есть ли причина, по которой вы не смогли этого сделать?

...
public double getMyReadableParam() {
    return params[0];
}

public void setMyReadableParam(double value) {
    params[0] = value;
}
...
3 голосов
/ 08 июня 2011

Да, это возможно, просто не используя массив:

double myReadableParameter;
double anotherReadableParameter;

Если вам нужен доступ к ним как к коллекции, вы всегда можете поместить их в список.

1 голос
/ 08 июня 2011

Если у вас есть массив значений типа double, и каждый элемент массива в определенной позиции имеет определенное значение, вы должны вместо этого создать класс.

public class MyParamBlob extends ParentParamBlob
{
    private double myReadableParameter;
    private double anotherParameter;
    private double yetOneMore;

    // getters and setters as appropriate
}

Если вам нужно иметь дело с существующим double[] из«снаружи» у вас может быть конструктор и / или метод, который принимает массив в качестве параметра.

public class MyParamBlob
{
    ...
    public MyParamBlob(double[] values)
    {
        setAll(values);
    }
    // getters and setters as appropriate
    ...
    public void setAll(double[] values)
    {
        myReadableParameter = values[0];
        anotherParameter = values[1];
        // etc.
    }
}

Изменить - объяснить мой комментарий

Если исходный родительский классчто это подкласс (причина, по которой double [] существует на первом месте) имеет геттер для массива, который может быть переопределен в этом классе, создавая и возвращая массив по запросу - например,

public double[] getParams()
{
    double[] params = new double[4];
    params[0] = myReadableParameter;
    params[1] = anotherParameter;
    // etc.
}

Если массив напрямую доступен из экземпляра родительского класса, без получения, например, myArray = parentInstance.params или double d2 = parentInstance.params[2], то (1) это плохой дизайн и (2) вызывающие могут изменитьсязначения массива из-под вас parentInstance.params[1] = 0.0;

...