2016-07-30 10 views
1

Ich habe gesehen, dass manchmal Methoden in einer Klasse, die nicht vom Instanzstatus abhängen, als markiert sind. Ich stelle fest, dass es dadurch deutlich wird, dass es ankündigt, dass "diese Methode unabhängig vom Instanzzustand ist". Es ist leicht, diese Methode vollständig zu überspringen, wenn Sie nach Chancen auf einen inkonsistenten Zustand suchen.Markierungsmethoden, die den Instanzstatus nicht lesen/schreiben

Das Problem beim Markieren der Methode static besteht jedoch darin, dass statische Methoden nicht vererbt oder außer Kraft gesetzt werden können.

So etwas wird hier diskutiert: Does it make sense to have a non static method which does not use an instance variable?

Wäre es sinnvoll eine Anmerkung zu haben, zu erklären, dass eine nicht-statische Methode staatlich unabhängig ist? Dann könnte der Compiler überprüfen, dass er nur andere zustandsunabhängige Methoden verwendet.

Gibt es eine solche Funktion in der Pipeline?

+1

Sicher wäre. Deshalb hat C++ * const *. Vielleicht möchten Sie überprüfen, ob jemand eine Anfrage in den Java-Community-Prozess gestellt hat. wenn nicht; fang an ;-) ... aber ernsthaft - die andere Sicht auf * static * ist: es ist eine Anomalie innerhalb von OO. Neben den genannten Problemen führen statische Aufrufe auch zu einer engeren Kopplung; und Code, der schwieriger zu testen ist. Der Punkt ist also: Sie vermeiden es wo es möglich ist. – GhostCat

+1

@GhostCat Beachten Sie, dass dies anders als C++ const ist, dies schlägt grundsätzlich eine überschreibbare/virtuelle statische Methode vor. – hyde

+0

@hyde Ja ... Wenn ich zwei Parameter an eine Methode übergebe und einen Rückgabewert erhalte, möchte ich manchmal sicher sein, dass (1) die Methode nur diese beiden Eingaben von dieser Klasse verwendet und (2) nicht mutieren den Zustand in irgendeiner Weise. – Teddy

Antwort

1

Es gibt keinen solchen Mechanismus in Java. Selbst static deckt nicht alle Fälle ab. Statische Methoden können den Status im statischen Kontext immer noch ändern.

class Example { 
    static int counter = 0; 
    static int add(int a, int b) { 
     counter++; 
     return a + b; 
    } 
} 

Aber es gibt einige Untersuchungen, dieses Problem mit statischer Analyse zu lösen. Sieht aus wie JPure hat einen funktionierenden Prototyp

+0

Vielen Dank. Das ist fast genau das, wonach ich gesucht habe. Ich frage mich, warum es kein Kern Java-Feature ist. Ich hoffe, dass es irgendwann in die Sprache eingebaut wird. Übrigens, hätten Sie einen Vorschlag diesbezüglich: http://stackoverflow.com/questions/23995683/improvement-of-package-private-classes-in-java – Teddy

+0

Ja, es wäre eine nützliche Funktion. Martin Odersky hat in seinem Vortrag über die Scala-Straßenkarte erwähnt, dass es in Zukunft ein Effektsystem haben wird, das eine Nebenwirkung in der Funktionssignatur kodiert. Aber ich erwarte diese Änderung in Java überhaupt nicht. –

+0

Ich habe Scala so lange aufgehört. Ich denke, ich sollte es ausprobieren. Ich liebe es einfach, wenn du keinen Abschnitt deines Codes ansehen musst, weil er als sicher markiert ist. Aus demselben Grund verwenden wir lieber unveränderbare Sammlungen oder markieren Felder final usw. Danke. – Teddy