3 Stimmen

Äquivalent von #define in Java für Makros

Meine Frage ist nahe an diese aber nicht ganz dasselbe.

Ich habe eine vererbt (d.h. ich kann/wird es nicht ändern) Array von Parametern in meiner Klasse wie folgt:

public double[] params;

Die Klasse verwendet diese Parameter auf komplexe Weise, so dass ich es vorziehen würde, für jedes Element im Array menschenlesbare Namen zu haben. In C würde man etwa so vorgehen

#define MY_READABLE_PARAMETER params[0]

Ich bin mir auch bewusst, dass ich in Java eine Reihe von Konstanten oder einen Enumerator mit Attributen erstellen könnte. Um auf einen Parameter zuzugreifen, müsste ich dann etwas wie das hier eingeben:

params[MY_READABLE_PARAMETER]

Das ist akzeptabel, aber ich würde den Array-Namen wirklich gerne ganz weglassen. Ist das möglich?

3voto

Karel Petranek Punkte 14845

Ja, es ist möglich, indem man einfach kein Array verwendet:

double myReadableParameter;
double anotherReadableParameter;

Wenn Sie auf sie als Sammlung zugreifen müssen, können Sie sie jederzeit in eine Liste aufnehmen.

3voto

Ben Punkte 5975

Gibt es einen Grund, warum Sie das nicht tun können?

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

public void setMyReadableParam(double value) {
    params[0] = value;
}
...

3voto

toto2 Punkte 5286

Mit Enum :

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

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

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

und Sie verwenden es als solches

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

Ich glaube nicht, dass es besser ist als die anderen Vorschläge, aber ich wollte zeigen, wie man es mit ENUM .

1voto

Stephen P Punkte 13778

Wenn Sie ein Array mit Doubles haben und jedes Arrayelement an einer bestimmten Position eine bestimmte Bedeutung hat, sollten Sie stattdessen eine Klasse erstellen.

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

    // getters and setters as appropriate
}

Wenn Sie sich mit einem bestehenden double[] von "außen" könnte man einen Konstruktor und/oder eine Methode haben, die ein Array als Parameter nimmt.

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.
    }
}

Edit - um meinen Kommentar zu erklären

Wenn die ursprüngliche übergeordnete Klasse, dass dies eine Unterklasse von (der Grund, die double[] in erster Linie existiert) hat ein Getter für das Array, das in dieser Klasse überschrieben werden könnte, Aufbau und Rückgabe des Arrays, wenn angefordert - z. B..

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

Wenn das Array direkt die von einer Instanz der übergeordneten Klasse aus zugänglich sind, ohne Getter, z. B. myArray = parentInstance.params o double d2 = parentInstance.params[2] dann (1) das ist ein schlechtes Design und (2) Anrufer könnten die Array-Werte aus Ihnen heraus ändern parentInstance.params[1] = 0.0;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X