array.length ist eine extra in die Syntax der Sprache eingebaut Spezialbehandlung. length auf einem Array ist nicht direkt ein Feld, wie Felder in anderen Klassen, und verhält sich auch anders, ist zum Beispiel nicht aufzählbar per Reflection.
Gerade Java selbst in seiner Ur-Form beinhaltet eine Menge No-Gos, von denen man Programmierer heute abzuhalten versucht. Der oftmals eigentlich unnötig direkte Zugriff auf Variablen wurde aber bis heute beibehalten, ich schätze mal, um Abwärtskompatibilität beizubehalten.
Auch liefern viele Methoden oft Arrays, wo Listen sinnvoller wären. Das mag daran liegen, dass Listen damals per get() nur Object liefern konnten oder auch damit, dass die Funktionen über Interfaces auf Systemmethoden zugreifen, wo Arrays notwendig werden. Hier kann man sich zum Glück mit Arrays.asList() helfen.
array.length ist allerdings syntaktischer Zucker. Es ist eine interne Laufzeitkonstante. Man müsste sich diesbezüglich mal den Bytecode dazu ansehen, ist sicherlich aufschlussreich.
Wieso?
Bei "Laufzeitkonstanten" passiert ja das umgekehrte. Eine Methode wird in eine Variable verlagert. Also um den File Separator über die Variable zu bekommen, wird intern die Methode FileSystem.getSeperator() aufgerufen. Ich empfinde eher diesen weg als Unnsinnig.
Array.length ist imo auch keine Laufzeitkonstante, sondern eine Eigenschaft. Laufzeit Konstante bedeutet für mich, dass der Wert zur ganzen Laufzeit bekannt ist und nicht veränderbar.
Nö
Ist eine Objektvariable, also an ein Objekt geknüpft. Existiert dieses Objekt nicht oder nicht mehr, existiert auch seine length Eigenschaft nicht oder nicht mehr.
Außerdem haben verschiedene Arrays verschiedene längen.
Aber diese Diskussion führt zu nichts. Es ist nur wichtig, zu beachten, dass man mit array.length wie mit einer Konstante umgehen kann (und keine Methodenaufrufklammern braucht). Wie es intern realisiert wurde, ist dabei unerheblich.
Das Vorgehen ist wie bei allen anderen Variablen auch, die sich ändern könnten, das heißt man braucht hier eine zusätzliche final Variable (bzw. effective final), womit dann das switch-case verwendet wird.
Das Vorgehen ist wie bei allen anderen Variablen auch, die sich ändern könnten, das heißt man braucht hier eine zusätzliche final Variable (bzw. effective final), womit dann das switch-case verwendet wird.
Noch mal zum Mitschreiben. Du hast behauptet der Zugriff auf .length wäre identisch zu dem Zugriff auf eine Konstante.
Damit müsste es im case Teil eines switch Statements funktionieren.
Es ist eben keine Konstante.
Noch mal zum Mitschreiben. Du hast behauptet der Zugriff auf .length wäre identisch zu dem Zugriff auf eine Konstante.
Damit müsste es im case Teil eines switch Statements funktionieren.
Drei? Die Antwort in dem Thread Casting war sein erster oder zweiter Post und da war es schon klar ... weshalb ich da auch gezögert habe zu antworten. Aber den report Knopf (die Admins haben meines Wissens Interesse nur an der Erkennung) hatte ich da schon gedrückt, ehe er in anderen Threads deutlich aufschlug
Edit: Natürlich ist mir klar, dass ihr mir jetzt vorhalten werdet, dass ich ja schon weiss, was andere später posten ... Daher ist es natürlich unfair, wenn ich so früh den Buzzer drücke weil ich Tobias erkannt habe ... ich kenne ja bereits Posts, die er noch schreiben wird
Es ist halt ein "const field". Aber es ist keine "static constant variable". Wäre es eine static constant variable, dann könnte man es als "constant expression" angeben. Die Links finden sich ja alle bereits in meinen bisherigen Antworten. Und bei 15.29 findet sich dann in der Auflistung:
Qualified names (§6.5.6.2) of the form TypeName . Identifier that refer to constant variables (§4.12.4).
Ich empfehle, mit einem neuen Account nicht gleich direkt auf Fragen zu antworten, sondern erstmal selbst Fragen zu stellen.
Denn das ist ja das Muster der meisten "normalen" User. Kaum jemand schlägt hier auf, um dann sofort mit Antworten (bzw. Diskussionsbeiträgen in existierenden Threads) um sich zu werfen.
Also nur so als Tipp.
Ich empfehle, mit einem neuen Account nicht gleich direkt auf Fragen zu antworten, sondern erstmal selbst Fragen zu stellen.
Denn das ist ja das Muster der meisten "normalen" User. Kaum jemand schlägt hier auf, um dann sofort mit Antworten (bzw. Diskussionsbeiträgen in existierenden Threads) um sich zu werfen.
Also nur so als Tipp.
Guter Tipp, aber die Erfahrung zeigt, dass der Detektor dennoch anspringt. Das hatten wir ja schon in der Vergangenheit mit z.B. Fragen zu Tic Tac Toe negamax Algorithmus und so ... Da war das sein Thread und beim Antworten war mir bereits klar, wer die Frage gestellt hat (nur eben interessiert mich das in der Regel nicht ).
Zu einer Meinung Argumente bringen. Wenn Dinge falsch sind, dann nicht nur schreiben, dass es "Bullshit" ist sondern auch hier Argumente bringen. Dann Namen weglassen oder ob jemand immer Recht hat oder so.
Ich denke, damit würde er jede Erkennung gnadenlos austricksen!
Und dann diese Genugtuung: Nach einem Jahr Aktivität - unerkannt im Forum - mit über 100 Posts in der Plauderecke ein Post: "Ätsch, ich bin Tobias und ihr habt mich nicht erkannt!"
Ja, das müsste gehen... Ich denke meine MI könnte er damit überlisten (MI: Menschliche Intelligenz).
Hm, den Unterschied (also, die unterschiedliche Verwendungsweise) kannte ich nicht. Wieder was gelernt, Danke. Dennoch verhält sich myArray.length ja nicht anders als ein const field. Und darauf wollte ich hinaus, dass dann die interne Realisierung "unwichtig" ist ...
Sooo ...
Über Bytecode sprachen wir noch gar nicht. 🤣 Aber hat der TE daran noch Interesse?
Dann darf eine Constant-Expression eben kein zusammengesetzter Ausdruck sein ... auch, wenn die JLS da eben keine weitere Unterscheidung vornimmt ...
Btw., ich habe noch nie eine Array-Länge als Case-Konstante in einem Switch-Case gebraucht. Ggf. gibt es dafür nicht mal einen (sinnvollen) Use-Case ...
Ja, der Schnitzer geht auf mich zurück. Ich meinte natürlich "final field" und meine Aussage in #32 ("const field" vs "static constant variable") sollte natürlich 1:1 das sein, was ich schon in #30 geschrieben habe mit Link auf die JLS:
Nein, weil ich Defizite nicht nur erkenne, sondern sie auch anspreche. Für die Kritikunfähigkeit der Anderen und die argumentative Unzugänglichkeit vieler kann ich aber nichts. Solche Defizite entstehen aber schon in der frühen Erziehung, daran kann man dann im Erwachsenenalter kaum etwas ändern.
Wieso?
Bei "Laufzeitkonstanten" passiert ja das umgekehrte. Eine Methode wird in eine Variable verlagert. Also um den File Separator über die Variable zu bekommen, wird intern die Methode FileSystem.getSeperator() aufgerufen. Ich empfinde eher diesen weg als Unnsinnig.
Array.length ist imo auch keine Laufzeitkonstante, sondern eine Eigenschaft. Laufzeit Konstante bedeutet für mich, dass der Wert zur ganzen Laufzeit bekannt ist und nicht veränderbar.
Ich würde diese "Konstanten" jetzt auch nicht zwingend als solche sehen. Wie du bereits korrekt gesagt hast, sind das im Grunde gar keine, sondern greifen auf Eigenschaften des Betriebssystems zu, bzw. ihr Inhalt ist betriebssystemabhängig. Hier ist das Design tatsächlich etwas fragwürdig, hier würde ich persönlich den Weg über eine Methode gehen. Aber Konstanten, bei denen im Quellcode dahinter ein fixer Wert steht, wären in einer Methode wohl nicht gut aufgehoben.