Vor- und Nachteile von Java

Status
Nicht offen für weitere Antworten.

ven000m

Bekanntes Mitglied
Hallo,

ich möchte sachlich und vor allem konstruktiv darüber diskutieren, wo bei Java absolute Grenzen liegen und wo es sich ziemlich gut einsetzen läßt?


Ich fange mal an, was haltet ihr davon, wenn Leute sagen:

Java ist nicht hardware nah und der Code ist zwangs open Source?
Was denkt ihr sind noch Vor/-Nachteile? 8)


Viele Grüße
 

0xdeadbeef

Top Contributor
1) Nicht "hardwarenah" ist ja nicht unbedingt immer was Schlechtes, zumal man über den Begriff diskutieren könnte.
2) Wenn der Code "obfuscated" wird, ist er zwar lesbarer als disassemblierter Maschinencode, aber ohne weiteres nachvollziehen und kopieren kann man den Code dann auch nicht mehr.

Java hat ein paar strukturelle Unschönheiten (Basisklassen<->Objekte, kein "copy by reference" möglich, String proprietär implementiert, keine Operatorenüberladung usw.), mit denen man aber leben kann. Die Hauptvorteile sind in meinen Augen die starke Funktionsbibliothek inklusive Swing und die (weitestgehende) Plattformunabhängigkeit.

Die Geschwindigkeit ist auch gerne ein Thema, aber da muß man wohl differenzieren: wenn man hauptsächlich Basistypen verwendet, kann Java dank JIT usw. atemberaubend schnell sein. Arbeitet man dagegen mit großen Objekthierarchien (Swing), bei denen viele Objekte temporär erzeugt und zerstört werden (wozu Java in gewisser Hinsicht geradezu einlädt), dann kann man ganz schnell eine ebenso atemberaubend schlechte Performance haben...
Wobei sich das ja irgendwann von alleine gibt (Moore und so) und man eigentlich die meisten Sachen bereits jetzt recht flott hinbekommt, wenn man sich etwas Mühe gibt.

Ein gerne übersehener Aspekt ganz zum Schluß: Java ist für lau, inklusive professioneller Entwicklungsumgebungen usw. Gerade was Entwicklungswerkzeuge das angeht, ist man in vielen anderen "freien" Sprachen (Python, Ruby) noch Lichtjahre von Java entfernt. Und für C++ gibt es vergleichbare IDEs derzeit nicht umsonst.
 

pogo

Bekanntes Mitglied
carbage collector hat Vor- und Nachteile.
man muss sich nicht um die Beseitigung kümmern, dafür ist nie wirklich garantiert, wann er anfängt.
 

dark_red

Bekanntes Mitglied
Open Source ist etwas anderes, ganz zu scheigen von freier Software.

Viele scheinen Open Source immernoch gleichzusetzten mit dem Umstand, dass ein belieber böser Konzern kommt, einem den Quelltext kopiert (klaut) kann und diesen dann teuer verkauft. Bei Opensource ist soetwas klar geregelt. Natürlich kann es verstösse geben, in dem jemand wirklich etwas macht, dass die Lizenz bricht. Das hat dann aber nichts mehr mit OpenSource zu tun, sondern ist eine illegele Aktivität. Von "zwangs OpenSource" zu sprechen ist daher höchst fraglich, da es nichts mit dem OpenSource phänomen zu tun hat, bis auf die Möglichkeit einer illegalen und nicht erwünschten Aktivität.

Des weiteren ist das Problem mit Java viel eher darin zu sehen, dass es von Java keine freie Implementation gibt. Wer also mit Java freie Software schreiben möchte, zwingt seine User sozusagen dazu, geschlossene, nichtfreie Software zu verwenden. Die Software ist für Leute, die auf freie Standards setzten also völlig Nutzlos. Natürlich besteht die Möglichkeit, dass ein brauchbarer freier Ersatz für das JRE geschrieben wird. Allerdings ist die Wahrscheinlichkeit gering, da der Aufwand sehr gross ist. Zudem muss man sich darum kümmern, was jetzt ist und nicht was in der Zukunft. Diese kann niemand vorhersehen und radikale veränderungen sind jederzeit möglich.

Dies ist dann wiederum ein Nachteil für Java und ein Vorteil für .NET, da dafür eine freie brauchbare Implementation mit Mono verfübar ist.

Ich will aber anmerken, dass ich jetzt mit Java die Technologie Java meine und nicht die Sprache (Syntax). Sun hat die Terminologie nicht so eindeutig getrennt, wie Microsoft.

Über die Sprache an und für sich zu schimpfen bringt nichts. Diese kann man nativ Compilieren und hat halt die üblichen Vor- und Nachteile. Will man einen Vorteil mehr haben, muss man dafür einen anderen opfern. Das Sprachdesign ist dabei eine sehr kompilzierte angelegenheit und es fällt mir schwer zu sagen, ob man jetzt zB Delegates wirklich braucht oder nicht.

Ein wirklicher Vorteil von Java ist, dass ausgezeichnete Entwicklungsumgebungen verfügbar sind. Des weiteren haben sie die Entwicklungsumgebungen in eine neue Stufe vorgewagt, die neue Standards setzt. Ich rede jetzt von Refractoring. Dies ist ein neues Element in Entwicklungsumgebungen und wer nicht bald nachzieht ist im Rennen um die beste IDE draussen. Selbst MS hat Refractoring Tools für seine neue Visual Studio Version angekündigt.

Für die Hardwarenahe Programmierung wird managed Code wie von Java oder .NET sowieso nicht benötigt. Da arbeitet man in der Regel mit C. Für Desktop und Serverapplikationen ist eine garbagecollector Sprache in Zukunft nicht mehr wegzudenken. Selbst Borland hat sein Delphi daraufhin angepasst (.NET unterstützung).
 

Bleiglanz

Gesperrter Benutzer
Java ist nicht hardware nah und der Code ist zwangs open Source?
Ersteres ist ein Vorteil (ausser man braucht die hardware-nähe wirklich), letzteres ist totaler Käse

"Open Source" heisst nicht, dass man mit einem Dissassembler wieder einen halbwegs guten Quelltext herstellen kann; das ist nämlich auch bei Sprachen ohne "virtuelle Maschine" so; wahrscheinlich sind die Tools fürs Reverse Engineering von windows.exe's sogar wesentlich besser und ausgereifter als die für Java...

Wenn man Open Source sagt, dann meint man damit fast immer Lizenzfragen, das Recht den Quelltext zu verändern usw.

Stärken von Java
============
- ausdrucksstark
- lädt zu gutem Design ein
- hardware/plattform unabhängig
- gute Tools
- gute Libraries
- performant (auch wenns viele nicht glauben)
- J2EE (auch wenns schwierig ist)
- GC
- Netzwerkfähigkeiten, RMI, usw. sehr gut
- Security Modell, Sandbox
- usw. usw.


Schwächen
========
- gute Swing-Apps schreiben ist sehr schwierig
- diverse "Altlasten" und "Unschönheiten"
- die Unterscheidung primitives/Objects
- Arrays sind keine Collections :)

was mich seit neuestem stört, sind die tausend Möglichkeiten, Klassen und Members "auszuzeichnen"

die modifieer (public, private, abstract, final) ["Teil der Sprache"]

die throws Klausel

Javadoc-Kommentare (/** reiner Text **)

Annotations (@seit neuestem)

Natürlich kann man sagen, dass die alle verschiedene Aufgaben haben, aber dass @overrides nicht zur Sprache gehört, liegt einzig daran, dass man es "früher" vergessen hat...
 
S

stev.glasow

Gast
Bleiglanz hat gesagt.:
die modifieer (public, private, abstract, final) ["Teil der Sprache"]

die throws Klausel

Javadoc-Kommentare (/** reiner Text **)

Annotations (@seit neuestem)
Soll das zu den Schwächen gehören?
Ich finde das gehört eindeutig zu den Stärken der Sprache.
 
B

bygones

Gast
für mich zählen auch die Array Problematik u.a. zu den Schwächen.

Des weiteren:
- Wrapper Klassen mit public Konstruktoren
- Concurrent programmierung (vor 1.5) - mit den synchronnizedCollection prinzip des Collections Framework
- Manche mies implementierten Klassen (Stack / Properties)
- das Legacy Problem der Generics....
usw
 

Bleiglanz

Gesperrter Benutzer
stevg hat gesagt.:
Bleiglanz hat gesagt.:
die modifieer (public, private, abstract, final) ["Teil der Sprache"]

die throws Klausel

Javadoc-Kommentare (/** reiner Text **)

Annotations (@seit neuestem)
Soll das zu den Schwächen gehören?
Ich finde das gehört eindeutig zu den Stärken der Sprache.

das Vorhandensein ist natürlich eine Stärke, was mich (leicht) stört ist das konfuse Nebeneinander

ähnlich gelagerte Unschönheit: Exceptions, z.B. in java.io.* und java.sql.*, die beiden verfolgen total unterschiedliche "Wurf"-Strategien :)

lauter kleine Nebeneinanders deprecateds und use instead usw., liegt oft am "historischen Wachstum" von Java, schon klar; wollte nur anmerken, dass es eben oft nicht mehr "schön" und "elegant" und "konsistent" ist ...
 

helium

Mitglied
Ein wirklicher Vorteil von Java ist, dass ausgezeichnete Entwicklungsumgebungen verfügbar sind. Des weiteren haben sie die Entwicklungsumgebungen in eine neue Stufe vorgewagt, die neue Standards setzt. Ich rede jetzt von Refractoring. Dies ist ein neues Element in Entwicklungsumgebungen und wer nicht bald nachzieht ist im Rennen um die beste IDE draussen.
*grübel*
Aha. Smalltalk-IDEs kennen schon ewig Refactoring-Möglichkeiten und das Java-IDEs nachgezogen sind ist jetzt ein umwerfender Vorteil von Java?

Stärken von Java
============
- ausdrucksstark
Mach mal bitte ein Beispiel dafür, was du meinst.
Angenommen, ich will einen kleinen Algorithmus schreiben, sagen wir sortiertes Einfügen in eine Liste, dann kann ich das "ausdrucksstark" beispielsweise in SML formulieren:

Code:
fun insert value [] = [value]
|    insert value (head::tail) = if value < head
                                 then value::head::tail
                                 else head::(insert value tail);

Aber in Java krieg ich sowas niemals so ordentlich hin.
 
S

stev.glasow

Gast
helium hat gesagt.:
Stärken von Java
============
- ausdrucksstark
Mach mal bitte ein Beispiel dafür, was du meinst.
Angenommen, ich will einen kleinen Algorithmus schreiben, sagen wir sortiertes Einfügen in eine Liste, dann kann ich das "ausdrucksstark" beispielsweise in SML formulieren:

Code:
fun insert value [] = [value]
|    insert value (head::tail) = if value < head
                                 then value::head::tail
                                 else head::(insert value tail);

Aber in Java krieg ich sowas niemals so ordentlich hin.
Was meint ihr mit ausdrucksstark? Entweder der Code macht was er soll oder nicht. Das ist doch nicht wie mit deutsch oder französich. oder wie oder was
 

dark_red

Bekanntes Mitglied
helium hat gesagt.:
Aha. Smalltalk-IDEs kennen schon ewig Refactoring-Möglichkeiten und das Java-IDEs nachgezogen sind ist jetzt ein umwerfender Vorteil von Java?
Nein, der Vorteil besteht darin, dass es erst durch die Java-Entwicklungsumgebungen zu einem richtigen Wettbewerb gekommen ist, welcher das Refractoring populär gemacht hat.
 
B

bygones

Gast
helium hat gesagt.:
Angenommen, ich will einen kleinen Algorithmus schreiben, sagen wir sortiertes Einfügen in eine Liste, dann kann ich das "ausdrucksstark" beispielsweise in SML formulieren:

Code:
fun insert value [] = [value]
|    insert value (head::tail) = if value < head
                                 then value::head::tail
                                 else head::(insert value tail);

Aber in Java krieg ich sowas niemals so ordentlich hin.
geil - ich seh zum ersten mal in meinem Leben SML außerhalb vom Hörsaal.... dachte gar net dass das einer benutzt..
so was z.b. in java
Code:
Set<String> set = new TreeSet<String>();
set.add("Hallo");
set.add("Aber Hallo");
set.add("Zuwieder");
einfügen in eine sortierte Liste....
oder
Code:
List<String> list = new ArrayList<String>();
// elemente hinzufügen ala
String element = "füg mich ein";
for(int i = 0; i < list.size(); i++) {
   if(list.get(i).compareTo(element) < 0) {
      list.add(i, element);
   }
}

meiner ansicht nach ist die von Java genutzte Syntax weit intuitiver als die SML syntax..... außerdem hast du bei funktionalen Sprachen keine Möglichkeit der Iteration....

ob das mit ausdrucksstarkt gemeint ist bezweifle ich aber
 

Bleiglanz

Gesperrter Benutzer
leider kann ich jetzt nicht richtig auf helium antworten, weil sonst wg. Beleidigung hier wieder rumgeschimpft wird

soll ich dir wirklich erklären, was ich meine, wenn ich eine Programmiersprache als ausdrucksstark bezeichne?

ist Java ausdrucksstärker als QBASIC1.0?

Eine eine hyperobskure Supersprache rauszukramen, irgendein blödes Konstrukt hinzuschreiben und das wort ICH auch noch zu fetten, das ist mir zu viel

hier mal dein listting ganz kurz in einer Sprache, die dir gefallen dürfte ("Whitespace"):
 
G

Guest

Gast
Ich könnte die Antworten von '0xdeadbeef' und 'Bleiglanz' direkt unterschreiben.
Ich sehe die Stärken von Java insbesondere im Serverbereich (J2EE, Webservices etc.).
Kombiniert mit guten Werkzeugen und Frameworks, kann man damit ziemlich
schnell komplexe Systeme aus dem Nichts zaubern. (Ant, XDoclet, Struts, Axis etc.)

Als Nachteil sehe ich die schlechte Integration in das Betriebssystem bzw.
das Default-Verhalten von Swing z.B. unter Windows oder Linux.
Plattformunabhängigkeit ist für mich kein Argument, da AWT und somit auch Swing
teilweise native implementiert sind. Ich denke, dass SWT hier eher den richtigen Weg
eingeschlagen hat, indem es Standarkomponenten der vorliegenden Plattform nützt.
Wobei SWT noch in den Kindeschuhen steckt und einiges nicht unterstützt (z.B. MDI; oder inzwischen doch? ;-)).

Fazit: Java wird immer besser und die Entwicklung damit ist leichter als in vergleichbaren 3GL Sprachen.
 

helium

Mitglied
leider kann ich jetzt nicht richtig auf helium antworten, weil sonst wg. Beleidigung hier wieder rumgeschimpft wird
Du darfst mich ruhig beleidigen

soll ich dir wirklich erklären, was ich meine, wenn ich eine Programmiersprache als ausdrucksstark bezeichne?
Ja mach mal.
Mein erster Ansatz wäre: Wenn man mit wenigen Konstrukten und wenig Code viel aussagen kann und das in übersichtlicher Weise. Und so leid es mir tut: Ich kenne Sprachen, die das meiner Meinung nach besser können, als Java.

ist Java ausdrucksstärker als QBASIC1.0?
Ja, auch wenn die Frage vermutlich nicht ernst gemeint war.

Eine eine hyperobskure Supersprache rauszukramen, irgendein blödes Konstrukt hinzuschreiben und das wort ICH auch noch zu fetten, das ist mir zu viel
Gut, jetzt beim nochmal lesen ist mir auch aufgefallen, das das mit dem ich nicht so toll rüberkommt. Das klingt so, als wollte ich sagen, ich wäre besonders toll. Ursprünglich wolle ich aber ausdrücken, dass es sich nur um meine Meinung handelt, da normalerweise die meisten alles sofort als allgemeine Wahrheiten ansehen. Das ist ziemlich in die Hose gegangen :(

Aber SML ist doch keine "hyperobskure Supersprache". Es ist eine ganz normale funktionale Sprache mit einigen imperativen Konstrukten. Davon gibts doch ganz schön viele. Und IMHO hat SML eine sehr saubere Synthax. Allgemein mag ich C-artige Sprachen nicht sonderlich und trotzdem arbeite ich hauptsächlich mit C++.

hier mal dein listting ganz kurz in einer Sprache, die dir gefallen dürfte ("Whitespace"):
Ja, kenn ich. Oder Das 99-Bottles-of-bear Programm in HQ9+:
Code:
9


außerdem hast du bei funktionalen Sprachen keine Möglichkeit der Iteration.
Naja, SML ist ja nicht rein funktional. Und es gibt z.B. ein while.


Auch wenn's vermutlich keinen interessiert: Eine meiner Meinung nach sehr gelungene Sprache ist Scala. Die hat alles, was man will (alle oo-Features, Funktionen höherer Ordnung, Pattern-Matching, ein interessantes System zur generischen Programmierung, ...) und eine Synthax, die mir gefällt.
 
B

bygones

Gast
da die diskussion weit von dem eigentlichen Thema abgewichen ist, habe ich das thema geteilt (auch wenn dadurch möglicherweise zitate durcheinander gehen)...

über scala oo-funktionale Sprachen usw bitte hier http://www.java-forum.org/de/viewtopic.php?t=11625 .

Die Frage war bzgl. Vor- und Nachteile von Java !!!
 

helium

Mitglied
Was denkt ihr sind noch Vor/-Nachteile?
Der größte Vorteil ist wohl die verdammt große und sehr saubere Bibliothek.

Außerdem ist die Sprache recht einfach, was dazu führt, das man sie schnell erlernt und wenig Möglichkeiten hat fehler zu machen. Daraus ergibt sich natürlich auch der Nachteil, das man nicht alles immer auch auf einfache Weise ausdrücken kann und man manchmal etwas umständliche Wege wählen muss. Möglich ist aber quasi alles.
Wenn du mal was Hardware-Nahes brauchst, kannst du das per JNI einbinden (auch wenn du dazu danan C lernen musst).
 

0xdeadbeef

Top Contributor
Sehe ich im Prinzip genauso. Habe vorher in C/C++ programmiert (C programmiere ich nach wie vor "beruflich") und insofern finde ich zunächst mal die ähnliche Grammatik sehr angenehm. Übrigens - neben dem Fehlen gelungener IDEs/GUI-Builder - aus meiner Sicht ein wesentlicher Punkt gegen Python, Ruby usw., deren Whitespace-Semantik mich fertigmacht (da kann ich ja auch gleich Whitespace oder Brainfuck programmieren, siehe http://www.99-bottles-of-beer.net).
An C stört mich nicht mal so sehr die fehlende Möglichkeit, objektorientiert zu programmieren, sondern der sehr hohe Aufwand, der für dynamische Strings/Listen/Arrays notwendig ist. In C++ benutzen die einen die STL, die anderen (bislang) die MFC-Äquivalente, meist ohne sich darüber bewußt zu sein, daß dann selbst Konsolenprogramme MS-spezifisch werden. Zudem fehlt die konsequente Unicode-Unterstützung von Java.
Außerdem fehlt der MFC die Möglichkeit von Layouts: bei Fensteranwendungen muß man alles "von Hand" programmieren, was wiederum dazu führt, daß 90% aller mit dem VisualStudio zusammengeklickten Mini-Anwendungen dialogbasiert sind. Nicht davon zu sprechen, daß es einem die MFC-Wizards sehr erschweren, Anwendung und Oberfläche klar zu trennen, um eine spätere Portierung auf eine andere Plattform zu erleichtern. Ich habe es auch immer als sehr negativ empfunden, daß man sich bei C/C++ unter Win32 gleich zu Beginn des Projekts dafür entscheiden muß, ob man eine Konsolenanwendung oder eine im Fenster programmieren will. Das geht sogar soweit, daß einer Fensteranwendung die main-Funktion fehlt (wie übrigens auch in Java bei Applets, was ich auch unschön finde, wo es aber einen gewissen Sinn hat). Da habe ich mir immer meinen Amiga zurückgewünscht. Aber siehe da: Java bietet mir wieder die lange vermißte Freiheit, in einem Konsolenprogramm ein Fenster zu öffnen.

Ein weiterer massiver Nachteil von C/C++ ist die Plattformabhängigkeit aller Integertypen (char, short, int, long). Wenn man wirklich plattformunabhängig programmieren will, erhöht das den Aufwand immens. Glücklicherweise wurde dieses Design nicht in Java übernommen. Das Fehlen von vorzeichenlosen Integertypen in Java habe ich - als alter C-Hase - zunächst als extreme und zudem völlig unnötige Einschränkung empfunden. Immerhin wird der darstellbare Zahlenbereich halbiert und einige Operationen auf unsigned Bytes o.ä. ziemlich verkompliziert. Der Vorteil ist allerdings, daß damit die (in C sehr fehlerträchtige) Vergleichsproblematik signed/unsigned gelöst wurde. IMHO wäre es aber zielführender gewesen, einfach wie in Lint den Vergleich signed/unsigned mit einer Compilerwarnung zu bestrafen und einen expliziten Cast zu verlangen. Bin mir nach wie vor nicht sicher, wie negativ ich diese Problematik werten soll.

Mal abgesehen von ein paar anderen Unschönheiten in Java (Wrapper, C-Switch/Case, Inkonsistenz Basistyp/Objekt, starres und inkonsistentes Parameterhandling), die mich aber im "Alltag" nicht übermäßig stören, ärgert mich vor allem, daß ein wesentliches Problem von C/C++ eher noch verschlimmert wurde:
Wenn man in C Elemente in einem Struct zusammenfaßt und davon per sizeof/memcopy oder per "=" eine Kopie anlegt, weiß man, daß diese Kopie immer "flach" ist. Die Funktionsweise ist immer klar und man muß halt aufpassen. In C++ sollte jede Klasse den "="-Operator so überladen, daß eine unabhängige Kopie entsteht. Darauf kann man sich natürlich nicht verlassen - in jedem Fall besteht immer die Möglichkeit einer performanten flachen Kopie.
Nun weiß ich nicht, ob es nur mir so geht, aber 90% der Fehler, an denen ich länger als ein paar Minuten rumsuche, entstehen durch ungewollte Abhängigkeiten bei flachen Kopien. Insofern hatte ich irgendwie gehofft, daß Java sich dieser Sache annimmt. Ich gehe gar nicht näher darauf ein, daß der Zuweisungsoperator nur bei Basistypen wie erwartet funktioniert, gäbe es eine Standard-Zuweisungsmethode (sowas wie Object.copy). Die gibt es aber schonmal nicht, stattdessen nur Object.clone(). Das macht es oft unmöglich, bereits allokierte Variablen weiterzubenutzen und man muß auf Kosten der Performance neu allokieren. Ich übergehe auch mal den unschönen Aspekt, daß das geklonte Objekt immer vom Typ Object ist. Besonders übel ist aber, daß einige Standardklassen gar keine Clone-Methode implementieren und alle (?) restlichen bloß eine flache Kopie anlegen.
Durch das Fehlen einer Copy-Methode wird man also nicht nur zu Neu-Allokation gezwungen, man bekommt per Clone (falls überhaupt) auch noch eine flache Kopie, bei der Fehler durch ungewollte Querverbindungen quasi vorprogrammiert sind. Im schlimmsten Fall bekommt man nicht mal eine flache Kopie (z.B. BigInteger) per Clone und kann sich überlegen, wie man über Umwege und bei meiser Performance irgendwie eine Kopie bekommt.
Im Licht dieser Problematik erscheint es übrigens plötzlich auch positiv, daß Strings "immutable" sind, was ich zunächst eigentlich als Design-Sünde empfunden habe. Wenigstens ist man aber so sicher, daß Strings in Listen usw. nicht nachträglich geändert werden können. Ich halte das aber nach wie vor für kein überzeigendes Design. Besser wäre es, Strings wären nicht immutable und tiefe Kopien wären dafür möglich.
 

0xdeadbeef

Top Contributor
Ist mir durchaus bekannt, dazu muß aber das betroffene Objekt (und alle Objekte darin) Serializable implementieren. Ich bezweifle auch, daß das ein sehr performanter Weg ist. Last but not least ist es eben ein Workaround, ändert also nichts daran, daß dieses wichtige Problem beim Design der Sprache offensichtlich übersehen wurde.
 
R

Roar

Gast
viele klassen bieten aber auch copy-konstruktoren an, wie z.B. String(String s) und alle klassen des COllections Frameworks sowie auch BigInteger und so....
 

0xdeadbeef

Top Contributor
Ein Copy-Konstruktor ist nichts anderes als ein typisiertes Clone.
Und BigInteger hat leider definitiv keinen Copy-Konstruktor.
 
R

Roar

Gast
0xdeadbeef hat gesagt.:
Und BigInteger hat leider definitiv keinen Copy-Konstruktor.

hm da hab ich mich wohl vertan :oops:

aber ich dachte du willst doch einen klon, oder hab ich dein posting falsch verstanden?
 

helium

Mitglied
Ein Copy-Konstruktor ist nichts anderes als ein typisiertes Clone.

Kannst du das bitte mal näher erläutern?

Wenn ich sowas habe:

Code:
Basiklasse foo = new Derivat();

und ich sage 'foo.clone()', dann kommt eine Instanz des Typs 'Derivat' raus. Wenn ich einen Copy-C'tor verwende, also 'new Basisklasse(foo)' dann bekomme ich da eine Instanz des Typs 'Basisklasse' mit Copy-C'toren ist ein klonen nicht möglich, da der Ziel zur Compilezeit bekannt sein muss. ODer sehe ich das falsch?
 

0xdeadbeef

Top Contributor
Ich meinte natürlich, daß der Copy-Konstruktor äquivalent zur Clone-Methode der gleichen Klasse ist.
Also um in Deinem Beispiel zu bleiben: "new Derivat(foo)" entspricht "foo.clone()".
 

helium

Mitglied
Und da siehst du doch auch schon das Problem.


Code:
void eineMethode (Basis foo)
{
   Basis derKlon = foo.clone();
   ...

   derKlon.bar(); 
}

Ich kann ein beliebiges Objekt, das von Basis abgeleitet ist übergeben. Jedes der (unendlich vielen) möglichen Derivate kann bar() anders implementieren. Da Klonen ein prozess ist, der den Laufzeittyp beibehält, wird auch wie erwartet beim aufruf von bar() auf derKlon die korrekte Methode aufgerufen.
Wollte ich das ganze mit einem Copy-C'tor machen, hätte ich ein Problem, da mir zur Compilezeit der Laufzeit-Typ nicht bekannt ist. Copy-C'toren bringen recht wenig in einer objektorientierten Welt. Lediglich bei Klassen, von denen nicht abgeleitet wird, macht ein Copy-C'tor sinn.
 

0xdeadbeef

Top Contributor
Ich bereue inzwischen mich zu dem Clone/Copy-Konstruktor Vergleich hinreißen gelassen zu haben (war das jetzt richtig?). Möchte da auch nicht weiter drauf rumeiern. War ja auch nie wirklich Gegenstand meiner Argumentation.
Fakt ist, daß "Standard"-Klassen wie BigInteger weder das eine noch das andere haben und daß ich standardisierte "DeepCopy/DeepClone" Methoden vermisse.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Nachteile von Java Allgemeine Java-Themen 90
T toArray() - Nachteile Allgemeine Java-Themen 2
V Nachteile von Adapter-Klassen Allgemeine Java-Themen 7
kodela Von C++ nach Java Allgemeine Java-Themen 1
Fey Java auf USB Stick Allgemeine Java-Themen 5
theJavaMaschine Mitstreiter gesucht: Gemeinsam Java und Android Development lernen! Allgemeine Java-Themen 5
PARAS Karriereberatung benötigt: Wie kann ich ein Java Full Stack Entwickler werden? Allgemeine Java-Themen 7
P Java Access Bridge Allgemeine Java-Themen 5
W ICEpdf PDF-Dateien werden mit Java 21 nicht nicht mehr vollständig dargestellt Allgemeine Java-Themen 3
MiMa Grundsätzliche Frage zur Verwendung von Java Versionen?? Allgemeine Java-Themen 3
OnDemand Java Deployment Vaadin Allgemeine Java-Themen 3
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4
J Class to link Java Allgemeine Java-Themen 4
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
mrStudent Inferenz JAVA Allgemeine Java-Themen 6
U URI Rechner (Java Script) Allgemeine Java-Themen 7
TheSkyRider Java Geburtsdatum Textfeld Allgemeine Java-Themen 7
mihe7 Java 19 JavaDocs: Browserintegration Allgemeine Java-Themen 1
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
C Fußnoten von DocX mit Java Allgemeine Java-Themen 2
C Fußnoten in DocX mit Java Allgemeine Java-Themen 1
MJannek Aussagenlogik in Java Programmieren Allgemeine Java-Themen 22
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
MJannek Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
K Nachhilfe Java Allgemeine Java-Themen 11
KonradN Java 19 Allgemeine Java-Themen 11
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
TheSepp Java bestimmtes Array auf den Wert 0 setzen Allgemeine Java-Themen 32
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
E Java und integrierte Grafikkarten Allgemeine Java-Themen 18
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 3
A Java unter Win 10 Allgemeine Java-Themen 1
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
T Java Robot Class - Bot Allgemeine Java-Themen 3
E Wie Java Heap Space vergrößern? Allgemeine Java-Themen 3
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
izoards Java Home Pfad unabhängig von der Version Allgemeine Java-Themen 7
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
KonradN CVE-2022-21449: Fehler in Java bei Signaturprüfung Allgemeine Java-Themen 20
berserkerdq2 Java sql Allgemeine Java-Themen 15
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
LimDul XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
Aartiyadav Comparisons and Swapa in Bubble-sort Java Allgemeine Java-Themen 6
KonradN Java 18 Allgemeine Java-Themen 8
N Statistische Auswertung von Logfiles (Einlesen, auswerten und grafische Aufbereitung von logfiles) mit Java Allgemeine Java-Themen 9
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
Z Mit Java 8+ Streams Zeilen nummern zu Zeilen hinzufügen Allgemeine Java-Themen 17
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben