11 Stimmen

Utility-Methode - Übergabe einer Datei oder eines Strings?

Hier ist ein Beispiel für eine Dienstprogrammmethode:

public static Long getFileSize(String fileString) {

    File file = new File(fileString);

    if (file == null || !file.isFile())
        return null;

    return file.length();
}

Ist es eine gute Praxis, einen String statt einer Datei an eine Methode wie diese zu übergeben? Welche Überlegungen sollten im Allgemeinen angestellt werden, wenn Dienstmethoden dieser Art erstellt werden?

3voto

Stephen C Punkte 665668

Dies ist die von mir bevorzugte Lösung:

public static Long getFileSize(String path) {
    return getFileSize(new File(path));
}

public static Long getFileSize(File file) {
    return (!file.isFile()) ? -1L : file.length();
}

Beachten Sie, dass -1L und nicht 0L zurückgegeben wird, damit der Aufrufer zwischen einer leeren Datei und einer "Datei", deren Länge aus irgendeinem Grund nicht bestimmt werden kann, unterscheiden kann. Die file.length() wird in einigen Fällen, in denen Sie keine Datei mit der Länge Null haben, Null zurückgeben; z. B.

  • wenn die file gibt es nicht
  • wenn die file ist ein Verzeichnis
  • wenn die file eine spezielle Datei ist (z.B. Gerätedatei, Pipe, etc.) und das Betriebssystem ihre Länge nicht bestimmen kann.

El file.isFile() Call befasst sich mit diesen Fällen. Es ist jedoch umstritten, ob die Methode(n) Folgendes zurückgeben sollten -1L oder eine Ausnahme auslösen. Die Antwort auf diese Debatte hängt davon ab, ob die -1L Die Frage, ob es sich um "normale" oder "außergewöhnliche" Fälle handelt, lässt sich nur in Bezug auf den Kontext bestimmen, in dem die Methode angewendet werden soll,

2voto

leonbloy Punkte 68836

Ich würde mich für eine Datei . Es fühlt sich für mich ein wenig OOP-gerecht an: mehr Typesafe ( Streicher sind in Java so 'allgemein'...) und semantisch aussagekräftig: Wenn Sie mit Dateien zu tun haben, dann übergeben Sie ein File-Objekt.

Erinnern Sie sich, dass in Java eine Datei Objekt stellt nicht wirklich eine Datei an sich (sein Inhalt), sondern vielmehr sein Weg: " Eine abstrakte Darstellung von Datei- und Verzeichnispfadnamen "(es kann sogar der Pfad einer nicht existierenden Datei sein) und das ist fast genau das, was Sie hier brauchen.

Dies kann nur in wenigen Fällen eine Einschränkung darstellen: wenn die "Datei" in Wirklichkeit eine Art Pseudodatei oder Ressource ist, z. B. innerhalb einer jar-Datei. Eine Alternative, die ich als nützlich empfunden habe, ist eine URI die (konzeptionell) eine Datei als Spezialfall, aber auch andere Ressourcen umfasst.

Und wenn Sie sich für die beiden Alternativen (String oder File) entscheiden, empfehle ich ausdrücklich nicht, die Methoden gleich zu benennen. Methodenüberladung kann ein Problem sein Verwenden Sie es nur, wenn es Ihnen einen greifbaren Nutzen bringt.

1voto

Thomas Jones-Low Punkte 6881

Ich würde denken, dass dies davon abhängt, was Sie an dem Punkt zur Verfügung haben, an dem Sie diese Methode aufrufen werden. Wenn Sie den Dateinamen (String), aber keine Datei haben, scheint es wenig Sinn zu machen, dass der Aufrufer die Datei aus dem Dateinamen erstellt.

Wenn ich mir nicht sicher bin, erstelle ich zwei Methoden, eine für String und eine für File. Die String-Methode erstellt dann die Datei und ruft die File-Methode auf.

public static long getFileSize (final String fileString) {
  return getFileSIze (new File (fileString)); 
}

public static long getFileSize (File file) {
   if (file == null || !file.isFile()) return null;
   return file.length();
}

1voto

Snehal Punkte 6680

Dies hängt vom erwarteten Nutzen auf der Kundenseite ab. Falls die Client-Seite bereits ein Dateiobjekt hat und die Dateigröße abrufen möchte, ist der Entwickler auf der Client-Seite gezwungen, den Dateipfad zu extrahieren und an die Utility-Methode zu übergeben. Um dies zu vermeiden, würde ich überladene Methoden anbieten: 1) mit File 2) File Path String

Außerdem würde ich, falls die Datei nicht verfügbar ist, eine Ausnahme auslösen, anstatt null zurückzugeben.

1voto

Binil Thomas Punkte 13559

Meine Empfehlung wäre, beides zu haben:

public static Long getFileSize(String path) {
    return getFileSize(new File(path));
}

public static Long getFileSize(File file) {
    return (file == null || !file.isFile()) ? 0L : file.length();
}

und lassen Sie Ihre Benutzer je nach der Art des Objekts, das sie zur Darstellung von Dateisystempfaden verwenden, wählen. Wie @Nikita erwähnte, ist keine der beiden Möglichkeiten falsch.

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