Ich habe oft gedacht, es wäre eine gute Idee, die Verwendung von Arrays als richtige Objekte mit ihren eigenen Methoden zuzulassen, statt sich auf Hilfsklassen wie Arrays, Arrays und ArrayUtils zu verlassen.
Zum Beispiel:
%Vor%Ich bin mir sicher, dass ich nicht der Erste mit dieser Idee bin, aber ich habe Schwierigkeiten gehabt, nach anderen zu suchen, die schon einmal darüber geschrieben haben. Kann mir jemand mit einigen Referenzen zu diesem Thema helfen?
Ist das eine gute oder schlechte Idee und warum?
Wie einfach wäre das umzusetzen?
Einige andere Beispiele könnten beinhalten (aber nicht aufhängen, sie sind nicht mit der Frage selbst):
%Vor%Arrays sind aus gutem Grund keine Klassen in Java - sie sind gut auf das Verständnis der Leute abgestimmt, wie ein Array aus Erfahrung mit C-artigen Sprachen funktionieren sollte. Es gibt auch Leistungsgründe dafür, Arrays eher zu Low-Level-Containern als zu Objekten zu machen. Aus diesem Grund gibt es manchmal Leistungsvorteile bei der Verwendung eines primitiven Arrays anstelle einer Sammlung.
Wenn Sie Objekte verwenden möchten, sollten Sie nur eine Sammlung verwenden (eine ArrayList ist ein Beispiel für eine Sammlung). Es kann klobig sein, aber Collections bieten die Art von methodischem Zugang, den Sie zu haben scheinen.
Diese Methoden fangen an, ziemlich nach Ruby- oder Python-Idiomen zu suchen. Leider kannst du das nicht in Java machen (wünsch dir das).
Zum einen, wie andere schon gesagt haben, machen die Collections-Klassen das für Sie. Zum anderen ist myarray.sort () nicht so schön, weil Sie Arrays von Objekten erstellen können, für die keine Sortierung definiert wurde. Angenommen, ich habe
%Vor%Und Foo ist nicht vergleichbar. Was passiert auf foos.sort ()? Wir würden definitiv nicht wollen, dass es nur für Primitive funktioniert.
%Vor%und Sie konnten sicherlich nicht zulassen, dass der Compiler nur die Syntax für vergleichbare Objekte zulässt. Und wenn du zu etwas wie
kommst %Vor%es ist irgendwie sinnlos, da Arrays in Java nicht erweiterbar sind.
Es würde nett sein, wenn das Ausdrucken eines Arrays Sie nicht so nutzlos
geben würde %Vor%Müll, obwohl.
Ja. Aber ich bin der Meinung, dass Java überhaupt keine Primitiven haben sollte . Ich denke Primitive in Java sind eine Pause von der Reinheit der Sprache. Alles in Java sollte Objekte sein. Ob die Objekte auf dem Stapel oder dem Heap zugeordnet werden, sollte ein Implementierungs -Detail der JVM sein ein Sprachkonstrukt. Aber ich denke, meine Meinung könnte radikaler sein als die meisten anderen.
Vor dem Autoboxieren war der Umgang mit Primitiven und Objekten sehr umständlich.
Wenn Arrays Objekte wären und autoboxiert (und generalisiert!) wären, könnten wir etwas wie
haben %Vor%oder
%Vor% Ja, ich glaube, dass Arrays eine API haben sollten, die über die in der Sprache selbst definierte API hinausgeht. Besonders ärgerlich ist, dass ein Foo[]
Iterable<Foo>
nicht implementiert. Ja, ich weiß, es ist einfach, es zu verpacken - aber es ist ärgerlich, dass du es tun musst.
.NET hat dies meistens richtig gemacht, mit dem Typ Array
, der hauptsächlich für nicht-generischen Zugriff gedacht ist, und verschiedenen generischen Schnittstellen, die als von den tatsächlichen Arrays implementiert gelten. Zum Beispiel:
(Es hilft, dass .NET-Generics besser mit primitiven Typen zurechtkommen als Java.)
Die einzigen Nachteile dieses Ansatzes bestehen darin, dass Arrays in .NET kovariant sein können, aber normale Generika nicht, und dass Dinge mit nicht-nullbasierten Arrays und rechteckigen Arrays leicht verwirrend sind.
>Nebenbei haben verschiedene Leute in diesem Thread Arrays als Primitive bezeichnet. Sie haben zwar eine besondere Handhabung, sind aber nicht primitiv. Aus der Sprachspezifikation, Abschnitt 4.2 :
Ein primitiver Typ ist von der Programmiersprache Java vordefiniert und wird von ihm benannt reserviertes Schlüsselwort (§3.9):
%Vor%
Bevor ich für SOLLTE antworten, werde ich Ihnen den Stand dieses Problems sagen.
In Arrays werden Arrays als Objekte betrachtet - Sie können sie beispielsweise in einer Liste speichern. Sie sind jedoch spezielle Objekte, da sie von Object erben, aber nicht instanziiert oder mit derselben Syntax aufgerufen werden (danke für die Korrektur Peter). Sie werden von der JVM für offensichtliche Leistungsprobleme aggressiv optimiert, und daher hängt die Art, wie ein Array gespeichert wird, von der Implementierung ab.
Das Sun-Argument würde also bedeuten, dass es, wenn sie eine Objekt-API für das Array geben würden, bestimmte Hardware-, Software- oder andere Spezifikationsmerkmale erfordern könnte.
Die einzige echte Schnittstelle für Arrays ist die statische Methode System.arrayCopy oder die statischen Methoden Array. *, die am effizientesten nach / von Arrays kopiert.
Als Antwort auf SOLL; Es wurde gelöst, obwohl ein Standard besser als die Antwort wäre: Verwenden Sie ArrayList.
Es ist keine BAD Idee. Tatsache ist, dass es bereits bei Collections gemacht wurde. Versuchen Sie, ArrayList zu erweitern, wenn Sie verrückt werden wollen.
Ich glaube, das ist sehr schwer zu implementieren, ohne die Kompatibilität auf vielen Ebenen zu stören.
Ich möchte Methoden direkt in "Array-Klasse" haben, ich glaube nicht, dass es jetzt möglich ist, es zu implementieren.
Mir persönlich gefällt die Idee, dass alles ein Objekt ist, und dies wurde zum Beispiel bereits im Smalltalk gemacht. Die Folgen, alles, sogar Methoden / Funktionen, zu einem Objekt zu machen, sind sehr weit reichend (siehe Smalltalk, um zu sehen, was ich meine). Die Konsistenz in der Anwendung der "Alles ist ein Objekt" -Regel führt zu einer Sprache, die nicht mehr wie C (oder Java) aussieht.
Java wurde sehr bewusst entworfen, um für C-Programmierer zugänglich zu sein, und es ist ihm gelungen, aber es ist nicht wirklich sehr objektorientiert im Vergleich zu Smalltalk. Es ist Erbe als eine C-Variante zeigt sich überall, wie in Arrays und die Tatsache, dass es Primitive gibt.
Um die Frage von SOLL zu beantworten, würde ich nein sagen, weil Java mit dieser Änderung nicht mehr Java wäre. Wie andere bereits erwähnt haben, gibt es andere Klassen, mit denen Sie Aufgaben erledigen können, die mit einem Array in C mit Objekten in Java erledigt wurden, aber primitive Datentypen und Arrays insgesamt loszuwerden ist eine Aufgabe, die besser einer anderen Sprache überlassen wird , IMHO.
Für diejenigen, die einen früheren Post verpasst haben, der geschlossen wurde. Einige andere Beispiele beinhalten
%Vor%Ein Grund, warum ich glaube, dass es nicht so schwer ist, ist, dass Sie Methoden indirekt hinzufügen können, indem Sie das Objekt ändern (Ein echter Hack, dem ich zustimme, aber es zeigt, dass es funktioniert) Fügen Sie dem Objekt folgende Methoden hinzu:
%Vor%Druckt
%Vor%Dies funktioniert mit Java 5 & amp; 6 und sowohl der Compiler als auch die IDE haben das so gehandhabt, wie ich es erwartet hatte.