it-swarm.com.de

Gibt es ein Java Äquivalent oder eine Methode für das Schlüsselwort typedef in C ++?

Aus C und C++ stammend, empfand ich typedef als äußerst hilfreich. Kennen Sie einen Weg, um ähnliche Funktionen in Java zu erreichen, sei es ein Java Mechanismus, ein Muster oder eine andere effektive Methode, die Sie verwendet haben?

234
bn.

Java hat primitive Typen, Objekte und Arrays und das war's. Keine Typedefs.

107
cletus

Wenn dies das ist, was Sie meinen, können Sie einfach die Klasse erweitern, die Sie eingeben möchten, z.

public class MyMap extends HashMap<String, String> {}
96
Zed

Es gibt kein typedef in Java ab 1.6, was Sie tun können, ist eine Wrapper-Klasse für das, was Sie wollen, zu erstellen, da Sie letzte Klassen (Integer, Double, etc) nicht unterklassifizieren können

14
z -

Wie andere bereits erwähnt haben,
In Java gibt es keinen typedef-Mechanismus.
Ich unterstütze auch keine "gefälschten Klassen" im Allgemeinen, aber es sollte hier keine generelle strenge Faustregel geben:
Wenn Ihr Code zum Beispiel immer und immer wieder einen "generischen Typ" verwendet, zum Beispiel:

Map<String, List<Integer>> 

Sie sollten auf jeden Fall in Betracht ziehen, eine Unterklasse für diesen Zweck zu haben.
Ein anderer Ansatz, den man in Betracht ziehen kann, ist beispielsweise, in Ihrem Code eine Verzögerung wie folgt zu haben:

//@Alias Map<String, List<Integer>>  NameToNumbers;

Und dann verwenden Sie in Ihrem Code NameToNumbers und haben eine Pre-Compiler-Aufgabe (ANT/Gradle/Maven), um relevanten Java Code zu verarbeiten und zu generieren.
Ich weiß, dass dies für einige Leser dieser Antwort seltsam klingt, aber so viele Frameworks haben "Annotationen" vor JDK 5 implementiert. Dies ist, was project lombok tut und andere Frameworks.

7
Yair Zaslavsky

Tatsächlich ist die einzige Verwendung von typedef, die auf Javaland übertragen wird, Aliasing - das heißt, Sie geben derselben Klasse mehrere Namen. Das heißt, Sie haben eine Klasse "A" und möchten, dass sich "B" auf dasselbe bezieht. In C++ würden Sie "typedef B A;"

Leider unterstützen sie es einfach nicht. Wenn Sie jedoch alle beteiligten Typen steuern, KÖNNEN Sie auf Bibliotheksebene einen unangenehmen Hack ausführen - Sie erweitern entweder B von A oder lassen B A implementieren.

5
Zack Yezek

Wie in anderen Antworten erwähnt, sollten Sie das Pseudotypedef-Antipattern vermeiden. Typedefs sind jedoch immer noch nützlich, auch wenn dies nicht der Weg ist, sie zu erreichen. Sie möchten zwischen verschiedenen abstrakten Typen mit derselben Java) Darstellung unterscheiden. Sie möchten keine Zeichenfolgen, die Kennwörter sind, mit denen verwechseln, die Straßenadressen sind, oder Ganzzahlen, die einen Versatz mit darstellen diejenigen mit denen, die einen absoluten Wert darstellen.

Mit dem Checker Framework können Sie eine typedef abwärtskompatibel definieren. Ich arbeite sogar für primitive Klassen wie int und Endklassen wie String. Es hat keinen Overhead zur Laufzeit und bricht keine Gleichheitsprüfungen.

Abschnitt Geben Sie Aliase und typedefs ein im Checker Framework-Handbuch beschreibt verschiedene Möglichkeiten zum Erstellen von typedefs, je nach Ihren Anforderungen.

2
mernst

Vielleicht könnte dies ein anderer möglicher Ersatz sein:

@Data
public class MyMap {
    @Delegate //lombok
    private HashMap<String, String> value;
}
2
shrewquest