Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
In C++ kann man z.B. auch dazu benutzen, um integers einem Eigenständigen Namen zu geben. Ich habe nochmal gegoogelt habe aber nichts passendes gefunden.
z.B.
typdef myint int;
private class myint extends Integer
ist z.B. nicht möglich, da Integer als final deklariert ist.
Danke
Sascha
Bevor jetzt aber wieder ein Frage kommt, wie "wozu brauchst du das denn?" :autsch:ueh:
Es ist manchmal ganz sinnvoll eigene Datentypen zum besseren Lesen zu Verwenden.
Außerdem ist es manchmal auch ganz sinnvoll einen selbstbeschriebenen Datentyp zu verwenden, wenn dieser zu einem späteren Zeitpunkt einfach ausgetauscht werden soll.
Es ist manchmal ganz sinnvoll eigene Datentypen zum besseren Lesen zu Verwenden.
Außerdem ist es manchmal auch ganz sinnvoll einen selbstbeschriebenen Datentyp zu verwenden, wenn dieser zu einem späteren Zeitpunkt einfach ausgetauscht werden soll.
Wozu brauchst du das denn?
"myint" liest sich jedenfalls nicht besser als "int" und ohne gemeinsame Schnittstelle kann man eh keine Datentypen später "einfach austauschen".
Hat's mich kurz geschaudert. Eigentlich sollte man IMHO nicht eine Klasse in dieser Form anlegen. Einerseits ist der Wunsch danach schon nachvollziehbar. Spätestens wenn man eine
Code:
private Map<List<? extends Comparable>, Set<List<? super List<? extends Number>>> freakyMap;
hat, könnte man versucht sein, das mit so einem "Pseudo-Typedef" zu einer einfachen Klasse "FreakyMap" zusammenzufassen. Aber für mich ist das unschön, weil es keine private Vererbung (wie in C++) gibt. Außer durch (ggf. aufwändige) Delegation kann man das kaum umgehen. Zumindest theoretisch etwas sauberer wäre dann sowas wie
aber ... naja - alles hat seine Grenzen. Es könnte aber Fälle geben, wo das gerechtfertigt ist - zumindest bei statischen inneren/package private Klassen ist ja alles erlaubt
Wozu brauchst du das denn?
"myint" liest sich jedenfalls nicht besser als "int" und ohne gemeinsame Schnittstelle kann man eh keine Datentypen später "einfach austauschen".
Tut mir Leid, dass du wegen mir einen Schock erleiden musstest .
Aber jetzt ernsthaft: so sehr ich auch über deine Argumente nachdenke und versuche, mir das an einem konkreten Fall vorzustellen, ich komm einfach nicht dahinter, wozu man das braucht. Darum lass ich die Frage noch im Raum stehen: Wozu brauchst du das denn?
Also da ich in letzter Zeit mehr C++ als Java mache, finde ich die schon recht toll
Manchmal bißchen verwirrend, da man dann nach 5 Verweisen draufkommt das isn ganz normaler String oder int aber der Typ heißt zB SATCHANNEL.
In der WinApi hat das MS eigentlich fast überall gemacht.. Aber unter Java kenne ich sowas nicht..
Ableiten ist ja nicht das gleiche und geht ja bei final Klassen sowieso nicht..
Wenn du einen eigenen Datentypen hast, kannst du den ja benennen wie du möchtest.
Wenn du aber keinen eigenen Datentypen hast, wäre es doch nur verwirrend einem bestehenden Datentypen einen anderen Namen zu verpassen.
Einerseits ist der Wunsch danach schon nachvollziehbar. Spätestens wenn man eine
Code:
private Map<List<? extends Comparable>, Set<List<? super List<? extends Number>>> freakyMap;
hat, könnte man versucht sein, das mit so einem "Pseudo-Typedef" zu einer einfachen Klasse "FreakyMap" zusammenzufassen. Aber für mich ist das unschön, weil es keine private Vererbung (wie in C++) gibt.
(unabhängig davon, wie man es umsetzen sollte oder wie nicht - natürlich sollte das nur ein Extrembeispiel sein, dass man so in jedem fall NICHT umsetzen würde, aber grundsätzlich wird's eben spätestens bei verschachtelten Generics schnell unübersichtlich...)
Ich brauche auch so was. Voll im ernst.
Zum Beispiel um bei einem Funktionsaufruf mehrere Parameter vom Typ String zu übergeben, die aber verschiedene Wertebereiche haben. kaufeSchuh(grösse, farbe) /* beide Parameter Strings */ dann könnte der Compiler feststellen, wenn die Argumente in der falschen Reihenfolge vorliegen.
Ich brauche auch so was. Voll im ernst.
Zum Beispiel um bei einem Funktionsaufruf mehrere Parameter vom Typ String zu übergeben, die aber verschiedene Wertebereiche haben. kaufeSchuh(grösse, farbe) /* beide Parameter Strings */ dann könnte der Compiler feststellen, wenn die Argumente in der falschen Reihenfolge vorliegen.
Oder wenn man es mit Strings macht wenigstens eine ordentliche Parametervalidierung mit entsprechender IllegalArgumentException - wenn man eine Methode falsch benutzt darf einem als Programmierer ruhig mal eine unchecked Exception bis nach ganz oben durchknallen, dafür sind die Dinger schließlich da.
(Für den Fall sind Enums aber tatsächlich schöner )
Ich brauche auch so was. Voll im ernst.
Zum Beispiel um bei einem Funktionsaufruf mehrere Parameter vom Typ String zu übergeben, die aber verschiedene Wertebereiche haben. kaufeSchuh(grösse, farbe) /* beide Parameter Strings */ dann könnte der Compiler feststellen, wenn die Argumente in der falschen Reihenfolge vorliegen.
Das Ganze macht meiner Meinung nach eh keinen Sinn, weil nach der Typdefinition 'myint' den Datentyp 'int' repräsentiert. Und ich hab noch nie gehört, dass man eine Klasse nach einem Datentyp benennen kann - das sind doch geschützte Wörter in einer Programmiersprache - oder irre ich mich hier?
Das Thema ist zwar schon etwas älter, aber da ich finde, dass an der Fragestellung bisher ein wenig vorbei geredet wurde, muss ich dazu noch was posten.
Java hat keine Typsynonyme, das heißt deswegen aber nicht, dass sie nicht sinnvoll einsetzbar sind. Sie erlauben umfassende Möglichkeiten typsicher zu programmieren. Die einfachste Form wäre
Code:
type File = String
. Das birngt noch nicht viel außer ein wenig Dokumentation des benutzen Typs. Parametrisierte Typen mit einem Typalias zu versehen ist schon sinnvoller, da sie einfacher zu benutzen sind
Code:
type ValidationList<A, B> = Validation<List<A>, B>
. Typaliase existieren nur zur Compilezeit, d.h. sie kosten keinen Runtime-Overhead (im Gegensatz zu einer Subklasse, die man in Java dafür verwenden müsste). In Haskell gibt es noch das
Code:
newtype
Schlüsselwort, das verhindert, dass man Funktionsparameter falsch verwendet:
Und ich hab noch nie gehört, dass man eine Klasse nach einem Datentyp benennen kann - das sind doch geschützte Wörter in einer Programmiersprache - oder irre ich mich hier?
. Das ist unschön, aber tatsächlich nur auf Sprachen begrenzt, die zwischen Objekten und primitiven Datentypen im Typsystem unterscheiden. In Haskell oder Scala wäre ein
Code:
type Int = String
(was wie gesagt keiner Vererbung entspricht) ohne Probleme möglich, warum sollte es auch nicht gehen? Kann der Compiler wieder alles wegoptimieren sodass kein Runtime Overhead entsteht (wobei das Beispiel natürlich dämlich ist).
wenn man eine Methode falsch benutzt darf einem als Programmierer ruhig mal eine unchecked Exception bis nach ganz oben durchknallen, dafür sind die Dinger schließlich da.
Warum sollte der Fehler erst zur Laufzeit erscheinen, wenn er auch vom Compiler gefunden werden kann? In Haskell wäre es unmöglich die oben gezeigte [c]buyShoe[/c] Funktion falsch aufzurufen. In Java hätte man ähnliche Typsicherheit mit enums auch, nur benutzt das so niemand. Ein
Code:
Shoe buyShoe(ShoeSize size, ShoeColor color)
findet man selten, eher
Code:
Shoe buyShoe(String size, String color)
. Wenn man da die Parameter vertauscht hat der Compiler keine Chance den Fehler zu finden. In Haskell würde niemand
Code:
buyShoe :: String -> String -> Shoe
schreiben (außer Anfänger).
Typsicherheit ist unglaublich wichtig - warum sonst sollten statisch typisierte Programmiersprachen existieren. Javas löchrige Typsystem ist aber kein Argument dafür Typsicherheit wieder unnötig aufzugeben.
Und ich hab noch nie gehört, dass man eine Klasse nach einem Datentyp benennen kann - das sind doch geschützte Wörter in einer Programmiersprache - oder irre ich mich hier?
Innerhalb der Sprache Java ist das tatsächlich absolut richtig. Im Bytecode könnte man solche Dinge allerdings umsetzen. Die JVM Spec ist in Sachen Bezeichner um einiges liberaler als die Programmiersprache
[OT]Entschuldigung - Aber - ich wurde auch angetrollt. Der Umgangston war aber dennoch nicht i.O. Löscht meinen Beitrag am besten wieder, ich kann ihn jetzt nicht mehr editieren. And if i must be cautioned, auch Ok[/OT]