Instance methods should not write to "static" fields

Adriano10

Bekanntes Mitglied
Java:
    private static final double BORDER_SIZE = 10;
    private static int size = 10;
    private static final double MAX_SIZE = 2.0;
    private static final double MIN_SIZE = 0.4;
    private final AbstractAutomaton automaton;
    private Canvas canvas;
    private final int rows;
    private final int cols;
    private StatesColorMapping mapping;
    private double sizeCell = 1.0;
    private boolean disableZoomIn;
    private boolean disableZoomOut;
    int cellSize;

    public PopulationPanelImpl(AbstractAutomaton automaton, Canvas canvas, StatesColorMapping mapping) {
        this.automaton = automaton;
        rows = this.automaton.getRows();
        cols = this.automaton.getColumns();
        this.cellSize = size * 2;
        this.canvas = canvas;
        this.canvas.setHeight(getMinStackPaneHeight());
        this.canvas.setWidth(getMinStackPaneWidth());
        this.mapping = mapping;
        paintPopulation();
    }

    public void paintPopulation() {
        GraphicsContext g = this.canvas.getGraphicsContext2D();
        g.clearRect(0, 0, this.canvas.getWidth(), this.canvas.getHeight());
        g.setStroke(Color.BLACK);
        g.setLineWidth(1);
        g.setFill(Color.WHITE);
        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < cols; c++) {
                g.setFill(mapping.setColor(automaton.getCell(r, c).getState()));
                g.fillRect(BORDER_SIZE + c * size, BORDER_SIZE + r * size, size, size);
                g.strokeRect(BORDER_SIZE + c * size, BORDER_SIZE + r * size, size, size);
            }
        }
    }


    public double getMinStackPaneWidth() {
        return Math.min(2 * BORDER_SIZE + automaton.getColumns() * cellSize, 3000);
    }

    public double getMinStackPaneHeight() {
        return Math.min(2 * BORDER_SIZE + automaton.getRows() * cellSize, 3000);
    }

    public void incZoom() {
        if (sizeCell < MAX_SIZE) {
            size++;
            incCellSize();
            sizeCell = sizeCell + 0.1;
            this.disableZoomIn = false;
            this.disableZoomOut = false;
            Platform.runLater(() -> {
                this.canvas.setHeight(getMinStackPaneHeight());
                this.canvas.setWidth(getMinStackPaneWidth());
            });
            paintPopulation();
        } else {
            this.disableZoomIn = true;
        }
    }


    public void decZoom() {
        if (sizeCell > MIN_SIZE) {
            size--;
            incCellSize();
            this.disableZoomOut = false;
            this.disableZoomIn = false;
            sizeCell = sizeCell - 0.1;
            Platform.runLater(() -> {
                this.canvas.setHeight(getMinStackPaneHeight());
                this.canvas.setWidth(getMinStackPaneWidth());
            });
            paintPopulation();
        } else {
            this.disableZoomOut = true;
        }
    }

    public void center(Bounds viewPortBounds) {
        double width = viewPortBounds.getWidth();
        double height = viewPortBounds.getHeight();
        if (width > this.getMinStackPaneWidth()) {
            this.canvas.setTranslateX((width - this.getMinStackPaneWidth()) / 2);
        } else {
            this.canvas.setTranslateX(0);
        }
        if (height > this.getMinStackPaneHeight()) {
            this.canvas.setTranslateY((height - this.getMinStackPaneHeight()) / 2);
        } else {
            this.canvas.setTranslateY(0);
        }

    }

    public Pair<Integer> getCell(double x, double y) {
        if (x < size || y < size || x >= size + this.automaton.getColumns() * size || y >= size + this.automaton.getRows() * size) {
            return null;
        }
        int row = (int) ((x - size) / size);
        int col = (int) ((y - size) / size);
        return new Pair<>(row, col);
    }

Moin zusammen,

Ich habe Warning (Instance methods should not write to "static" fields) in der Zeilen 71 und 53. Was ist der beste Weg, diese Fehlermeldung zu beheben?

Wenn ich die Variable nicht static mache, dann funktioniert nicht mehr, wie gewünscht ist.
was ist der beste Weg
 

KonradN

Super-Moderator
Mitarbeiter
Bezüglich bestem Weg: Hier wäre natürlich ein vernünmftiges Design zu nennen, bei dem ein State nicht in einer statischen Variable vorgehalten wird.

Ansonsten ist die Warnung ggf. weg, wenn Du auf die Klassenvariable expliziz als Klassenvariable zugreifst:
Also statt einem size++; nutzt Du ein PopulationPanelImpl.size++;
Oder eine statische Methode, die diese Veränderung vornimmt und Du rufst nur die statische Methode auf.

Ansonsten ist das eine Warnung, die Du auch akzeptieren kannst - das Design ist nicht optimal und der Compiler weist Dich darauf hin.
 

Adriano10

Bekanntes Mitglied
Bezüglich bestem Weg: Hier wäre natürlich ein vernünmftiges Design zu nennen, bei dem ein State nicht in einer statischen Variable vorgehalten wird.

Ansonsten ist die Warnung ggf. weg, wenn Du auf die Klassenvariable expliziz als Klassenvariable zugreifst:
Also statt einem size++; nutzt Du ein PopulationPanelImpl.size++;
Oder eine statische Methode, die diese Veränderung vornimmt und Du rufst nur die statische Methode auf.

Ansonsten ist das eine Warnung, die Du auch akzeptieren kannst - das Design ist nicht optimal und der Compiler weist Dich darauf hin.
Danke für die Rückmeldung, also die Methoden static zu machen, ist leider unmöglich, da PopulationPanelImpl implementiert eine Interface. Mit diesem PopulationPanelImpl.size++ ist die Warnung leider nicht weg.
 

KonradN

Super-Moderator
Mitarbeiter
Danke für die Rückmeldung, also die Methoden static zu machen, ist leider unmöglich, da PopulationPanelImpl implementiert eine Interface. Mit diesem PopulationPanelImpl.size++ ist die Warnung leider nicht weg.
Nicht die ganze Methode - Du erstellst nur eine Methode, die eben die statischen Veränderungen machen würde. Und dann hättets Du einen Aufruf einer statischen Methode statt eben der direkten Veränderung.

Also etwas wie:
Java:
static void increaseSize() {
    size++;
}

// Statt dem size++; hättest Du dan nuim Code:
increaseSize();

Damit beseitigst Du evtl. die Warnung, aber an dem schlöechten Design hast Du natürlich weiter nichts verändert fürchte ich.
 

Adriano10

Bekanntes Mitglied
Nicht die ganze Methode - Du erstellst nur eine Methode, die eben die statischen Veränderungen machen würde. Und dann hättets Du einen Aufruf einer statischen Methode statt eben der direkten Veränderung.

Also etwas wie:
Java:
static void increaseSize() {
    size++;
}

// Statt dem size++; hättest Du dan nuim Code:
increaseSize();

Damit beseitigst Du evtl. die Warnung, aber an dem schlöechten Design hast Du natürlich weiter nichts verändert fürchte ich.
Top, vielen Dank, hat super funktioniert
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
rummeldummel Compiler-Fehler No enclosing instance Java Basics - Anfänger-Themen 2
M OOP No enclosing instance... in Eclipse Java Basics - Anfänger-Themen 3
L Instance of ClassLoader-Klasse? Java Basics - Anfänger-Themen 3
K Abstrakte Klasse: vererbte Klasse; instance of? Java Basics - Anfänger-Themen 26
T Cannot refer to an instance field xxx while explicitly invoking a constructor Java Basics - Anfänger-Themen 14
K instance Java Basics - Anfänger-Themen 5
S Instance? Java Basics - Anfänger-Themen 4
R abstract class <-> instance Java Basics - Anfänger-Themen 6
S Methods passing Java Basics - Anfänger-Themen 2
A Exceptions und methods Java Basics - Anfänger-Themen 2
V Static Methods Java Basics - Anfänger-Themen 5
G Class with Methods Java Basics - Anfänger-Themen 3
M Methods ausführen NACH Schließen eines JFrames Java Basics - Anfänger-Themen 9
G Hashtables in methods Java Basics - Anfänger-Themen 13
V the static method should be accessed is a static way Java Basics - Anfänger-Themen 6
P Parameter in extra Klasse ->should be accessed in static Java Basics - Anfänger-Themen 6
B ".should be accessed in a static way"? Java Basics - Anfänger-Themen 6
G classs x is public, should be declared in a file named x.jav Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben