Wie programmiere ich ohne Nebenwirkungen in Java?

7

Als langjähriger Java-Programmierer und in den letzten Jahren ein Haskell-Abhängiger, lerne ich jetzt Scala. Meine Frage ist:

Wie programmiert man ohne Nebenwirkungen in Java?

d. Wie kann ich manuell tun, was Scala für mich tut?

Das Scala-Buch von Odersky erklärt häufig funktionale Begriffe in Bezug auf die OO-Terminologie (z. B. val = final, if = ternary op.).

Gibt es einen barrierefreien Leitfaden, wie man ohne Nebenwirkungen in Java programmiert (so wenig wie möglich)? Ich denke, man könnte viele der bekannten Vorteile mit einfachem, altem Java und etwas Disziplin (z. B. nicht veränderbare Sammlungen, endgültige Werte, starre Methoden, die den Objekt- / Anwendungszustand nicht verändern) erhalten.

    
Bastl 05.12.2011, 13:27
quelle

4 Antworten

9

Siehe Funktionales Java .

    
Daniel C. Sobral 05.12.2011, 14:48
quelle
11
  1. Machen Sie jede Methode, jedes Feld und jede Klasse entweder abstract oder final .
  2. Machen Sie jeden Variablen- und Methodenparameter final .
  3. Wenn Sie veränderbare Strukturen wie Array oder I / O-Ressourcen wie Dateien und Datenbankverbindungen verwenden, dürfen Sie sie niemals dem Geltungsbereich entziehen, in dem sie erstellt wurden.
Apocalisp 05.12.2011 19:07
quelle
7

Eine Möglichkeit, ohne weniger Nebenwirkungen zu programmieren, besteht darin, nur unveränderlich Klassen. Sie können dies auf Ihre eigenen Klassen anwenden, aber Sie können die Standard-Java-Laufzeit nicht ändern, ohne von Grund auf neu zu schreiben.

Jedenfalls macht es keinen Sinn, Java-Nebeneffekte frei zu machen, weil es eine imperative Programmiersprache mit OO-Datenkapselung ist. Mit anderen Worten, Nebenwirkungen sind Teil der Sprache und nicht per se schlecht.

    
PeterMmm 05.12.2011 13:46
quelle
5
  

Als langjähriger Java-Programmierer und in den letzten Jahren ein Haskell-Abhängiger, lerne ich jetzt Scala.

Glückwunsch:)

  

Wie programmiert man ohne Nebenwirkungen in Java? Wie kann ich manuell tun, was Scala für mich tut?

Nun, Scala tut nicht viel für Sie (im Vergleich zu Haskell) in Bezug auf die Durchsetzung oder Unterstützung einer Nebenwirkungsfreiheit. Zum Beispiel haben Sie in Scala immer die Option, var zu verwenden, wo immer Sie möchten, während in Haskell, wenn Sie veränderbare IORef oder STRef möchten, müssen Sie dies dem Typsystem mit der entsprechenden Monade anzeigen.

Mit anderen Worten, obwohl Sie fragen, wie man Scala-Stil in Java nachahmen kann, ist der erste Schritt zu überlegen, wie man den Haskell-Stil in Scala nachahmt, was natürlich Scalaz kommt ins Spiel.

Alles was gesagt wird, ich denke, Sie haben meistens Ihre eigene Frage beantwortet:

  

Ich denke, man könnte viele der bekannten Vorteile mit einfachem, altem Java und etwas Disziplin bekommen (z. B. nicht veränderbare Sammlungen, endgültige Werte, starre Methoden, die den Objekt- / Anwendungszustand nicht verändern).

Disziplin ist mindestens die Hälfte der Geschichte. Die Verwendung von final und unveränderbaren Sammlungen (à la Guava ) hat alle möglichen Konsequenzen für das Ende des Codes sieht aus wie. Die andere Hälfte der Geschichte ist natürlich, was tun Sie, wenn Ihr Programm Nebenwirkungen (wie E / A) erfordert? In Haskell würden Sie die IO -Monade verwenden, und in Scala könnten Sie scalaz.effects.IO , aber in Java, um ehrlich zu sein, denke ich, dass es kein Kampf ist, der es wert ist, bekämpft zu werden.

Meiner Meinung nach sind die zwei wichtigsten Zeilen von Code im funktionalen Stil, die Sie in einem beliebigen Java-Programm schreiben werden, die folgenden:

%Vor%

Der Rest ist eine Übung für den Leser;)

    
mergeconflict 05.12.2011 19:41
quelle