Was bedeutet die Namenskonvention 'von' in Java?

73

Wie wir in Java 8, gibt es viele Methoden mit dem Namen ‚von‘, wie zu sehen Stream.of(), Optional.of()und viele Bibliotheken wie actorOfin Akka.

Was bedeutet dieses "von"? Ist es das englische Wort "of" oder eine Abkürzung für so etwas wie "Object Factory"?

Jimmy Guo
quelle
Übrigens würde ich mir vorstellen, dass die Objektfabrik in einer richtig benannten Klasse oder Methode mindestens als "OF" erscheint.
Verrückter Physiker
7
In allen Beispielen, die ich mir in den Standard-Java-APIs vorstellen kann, bedeutet dies "von" im normalen englischen Sinne. Fragen Sie die Autoren nach APIs von Drittanbietern. (Sie könnten absichtlich Identifikationskonventionen ignorieren, indem sie Akronyme erfinden und nicht richtig groß schreiben.)
Stephen C
3
Es ist nur ein weiterer halbherziger Versuch, es wie Englisch klingen zu lassen. A Stream.of(1,2,3)klingt okay, Optional.of(1)ist aber einfach komisch. actorOfist noch seltsamer und sollte wirklich genannt werden createActor.
user253751
1
Es ist auch ein kurzes Wort, das wichtig ist, wenn Sie es häufig verwenden.
Thorbjørn Ravn Andersen
Stream.of(a,b,c)lautet: Ein Stream bestehend aus a, b und c.
Khaled.K

Antworten:

100

Es ist ein englisches Wort, ja. Es wird normalerweise so gewählt, dass der Ausdruck wie eine englische Phrase liest. Zum Beispiel Stream.of(3, 4)soll es wie ein "Strom von drei und vier" aussehen, was einer verkürzten Version von "einem Strom, der aus den Zahlen drei und vier besteht" ähnelt.

Chris Martin
quelle
39

Wie traditionell, wenn Sie sich Wrapper-Klassen ansehen, enthalten sie alle valueOf(XXX)Methoden zum Erstellen einer Instanz der Wrapper-Klasse des angegebenen Wertetyps .

Integer.valueOf(int)
Double.valueOf(double)
Float.valueOf(float)

Java folgt dieser Namenskonvention ab Tag 1. In ähnlicher Weise enthalten die meisten von Java-8 eingeführten Klassen diese of(...)Methode stark.

Stream.of(...)
LocalDate.of(year, month, dayOfMonth)
Instant.ofEpochSecond(epochSecond)
and many more.

Es sind nicht nur valueOfoder ofMethoden verfügbar, es gibt nur wenige weitere Methoden, die einem bestimmten Zweck oder Aufgabentyp in verschiedenen Klassen dienen, und sie haben einen am besten geeigneten Namen zugewiesen, der diese Aufgabe darstellt.

  • parseXXX (): Zum Parsen der angegebenen Zeichenfolgeneingabe. Beispiele: Integer.parseInt(str), Double.parseDouble(), Date.parse(datestr)etc.
  • get (Feld): Abrufen von Feldinformationen aus dem Objekt. Beispiel: Calendar.get(field), LocalDate.get(TemporalField)etc.
  • format (): Konvertierung in eine andere Darstellung. Beispiel: String.format(), SimpleDateFormat.format(), DateTimeFormatter.format()etc.

Diese Namenskonventionen werden in der Java8 DateTime-API häufig verwendet. Schauen Sie sich diese Methodenbenennungskonventionen an

sanit
quelle
29

Dies ist eine gängige Namenskonvention für statische Factory-Methoden .

Joshua Bloch erwähnt Folgendes über das Muster und die damit verbundenen Namenskonventionen in Effective Java (2. Ausgabe) , Punkt 1: Betrachten Sie statische Factory-Methoden anstelle von Konstruktoren (Hervorhebung hinzugefügt):

... (a) Der Nachteil statischer Fabrikmethoden besteht darin, dass sie nicht leicht von anderen statischen Methoden zu unterscheiden sind. Sie fallen in der API-Dokumentation nicht so auf wie Konstruktoren. Daher kann es schwierig sein, herauszufinden, wie eine Klasse instanziiert werden kann, die statische Factory-Methoden anstelle von Konstruktoren bereitstellt. Das Javadoc-Tool kann eines Tages die Aufmerksamkeit auf statische Factory-Methoden lenken. In der Zwischenzeit können Sie diesen Nachteil verringern, indem Sie auf statische Fabriken in Klassen- oder Schnittstellenkommentaren aufmerksam machen und allgemeine Namenskonventionen einhalten . Hier sind einige gebräuchliche Namen für statische Factory-Methoden:

  • valueOf- Gibt eine Instanz zurück, die im Großen und Ganzen denselben Wert wie ihre Parameter hat. Solche statischen Fabriken sind effektiv Typkonvertierungsmethoden.

  • of- Eine prägnante Alternative zu valueOf, die von EnumSet (Punkt 32) populär gemacht wurde.

...

Wie andere bereits betont haben, bedeutet "von" das englische Wort "von" und ist keine Abkürzung. Einer der Gründe für die Verwendung dieser Konvention besteht darin, leichter herauszufinden, ob eine Klasse eine Factory-Methode bereitstellt, da statische Fabriken in JavaDocs (im Vergleich zu Konstruktoren) nicht in einem separaten Abschnitt angezeigt werden.

Meiner Meinung nach besteht ein zusätzlicher Vorteil bei der Verwendung von statischen Fabriken mit kurzen und beschreibenden Namen darin, dass der Code wie Prosa gelesen wird , was nicht der Fall ist, wenn er mit newKonstruktoraufrufen übersät ist .

Mick Mnemonic
quelle