32 Stimmen

Java: statische abstrakte (wieder) - beste Praxis, wie man umgeht

Ich verstehe theoretisch, warum es keine abstrakt statisch in Java, wie zum Beispiel erklärt in Warum können statische Methoden in Java nicht abstrakt sein? .

Aber wie löse ich dann ein solches Problem?

Meine Anwendung verwendet einige Dateitypen, denen ich statische Eigenschaften wie eine Beschreibung des Dateityps zuweisen möchte (z. B. "Datendatei", die andere ist "Konfigurationsdatei" usw.). Natürlich würde ich das in einen statischen String packen, so dass die Beschreibung zugänglich ist, ohne eine Datei zu instanzieren (nützlich z.B. für die GUI). Andererseits sollten natürlich alle Dateitypen einige gemeinsame Methoden haben wie getStatus() , die ich natürlich von einer gemeinsamen Oberklasse erben möchte MyFileType .

getDescription() wäre natürlich in der Oberklasse abstrakt.

Ich habe versucht, eine Kombination aus einer Oberklasse und einer Schnittstelle zu verwenden, aber das Problem ist ähnlich: Eine statische Implementierung einer abstrakten Methode ist nicht zulässig.

Wie würde ein Java-Guru dieses Problem lösen? Ist es wirklich eine so schlechte Implementierung, die ich erstellen möchte?

Vielen Dank! Philipp

-1voto

Abdullah Jibaly Punkte 49866

Klingt, als müssten Sie ein Singleton verwenden. Im Grunde rufen Sie eine statische Methode wie MyFileTypes.getDataFileInstance() das eine einzelne Instanz eines Objekts erstellt (oder wiederverwendet, wenn es bereits erstellt wurde) und beim ersten Erstellen die "Konstanten" nach Bedarf einrichtet. Ich werde sehen, ob ich ein gutes Beispiel für Sie finden kann, aber Ihr Beitrag ist nicht sehr klar, wie Sie es verwenden möchten.

-1voto

hvgotcodes Punkte 114342

Sie könnten eine FileMetadata-Klasse erstellen, die alle benötigten Informationen enthält. Wenn Ihre Anwendung startet, könnten Sie Instanzen von FileMetadata erstellen und statische Zeiger auf sie speichern, damit Sie von überall in der JVM auf sie zugreifen können.

Auf diese Weise werden die abstrakten Dinge in die tatsächlichen Instanzen eingefügt; alles, was keine abstrakte Semantik erfordert, kann statisch sein...

-1voto

biziclop Punkte 47795

Ich weiß nicht, wie ein Java-Guru das Problem lösen würde, aber ich würde wahrscheinlich eine Ressourcenbündel mit allen Beschreibungen in einer Eigenschaftsdatei wie dieser:

com.bigcompany.smallapp.files.DataFile=Data file
com.bigcompany.smallapp.files.ConfigFile=Config file

Die Handhabung des Bündels kann bequem in der Superklasse oder an anderer Stelle platziert werden.

Eine andere Möglichkeit ist die Verwendung von Reflection, um auf die statischen Felder in jeder Unterklasse zuzugreifen, aber dann müssen Sie sicherstellen, dass alle Unterklassen ein statisches Feld mit demselben Namen haben.

Es könnte auch andere Optionen geben, sogar ein Refactoring des Codes, so dass die Subtypen nicht durch jeweils eine eigene Klasse repräsentiert werden, aber im Allgemeinen gibt es keine wasserdichte Lösung.

-1voto

Anstatt Ihre statischen Eigenschaften tatsächlich in statische Eigenschaften zu setzen, setzen Sie einen Verweis auf MyFileTypeDescription als statische Eigenschaft.

d.h.

class MyFileType {
   static MyFileTypeDescription description;
   ...
   <your regular attributes>
}
abstract class MyFileTypeDescription {
  String name;
  abstract String getDescription();
}

Etwas in dieser Richtung, wenn ich Ihr Problem richtig verstanden habe.

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