Konstante in Java

mihe7

Top Contributor
Wären die "Variablen" in den Zeilen 12 bis 14 weder static noch final, wären es Instanzvariablen. Sind die Variablen static, spricht man von Klassenvariablen. Instanz- und Klassenvariablen können final deklariert werden, dann spricht man gewöhnlich von Konstanten. Den Rest kann man so lassen.
 

mrBrown

Super-Moderator
Mitarbeiter
Instanz- und Klassenvariablen können final deklariert werden, dann spricht man gewöhnlich von Konstanten.

Es ist aber doch eher unüblich, dass man finale Instanzvariablen als Konstanten bezeichnet?

Und nein - Instanz und Klassenvariablen explizit auf null setzen ist unnötig, denn diese Variablen haben schon eine entsprechende Initialisierung.
Bei einer lokalen Variable kann es Sinn machen, denn diese hat keinen initialen Wert und kann erst gelesen werden, nachdem eine Initialisierung stattgefunden hat ...
Wobei es bei lokalen Variablen dann schnell mal den Fehler versteckt, dass man die Variable nicht korrekt initialisiert, von daher würde ich auch bei lokalen Variablen darauf verzichten, soweit möglich.
 
K

kneitzel

Gast
Es ist aber doch eher unüblich, dass man finale Instanzvariablen als Konstanten bezeichnet?
Das wäre eine umgangssprachliche Bedeutung, die ich nachvollziehen kann. Aber was wäre dann die Bezeichnung für eine final Instanz-Variable?

JLS 4.12.4 ist da aber zum Glück wieder ganz genau:
A constant variable is a final variable of primitive type or type String that is initialized with a constant expression (§15.29). Whether a variable is a constant variable or not may have implications with respect to class initialization (§12.4.1), binary compatibility (§13.1), reachability (§14.22), and definite assignment (§16.1.1).
Das wäre dann interessant, wenn man das "Konstante" als "contant variable" sehen würde bei der Bedeutung.

Wobei es bei lokalen Variablen dann schnell mal den Fehler versteckt, dass man die Variable nicht korrekt initialisiert, von daher würde ich auch bei lokalen Variablen darauf verzichten, soweit möglich.
Ja, ganz klar. Daher sind so Initialisierungen immer nur zu machen, wenn diese notwendig und sinnvoll sind.

Wobei ich da beim Wording evtl. das durchaus anders sehe - ich versuche schon, bei der Deklaration einer Variablen auch die Initialisierung zu machen - so möglich. Einfach damit der Gültigkeitsbereich so klein wie möglich gehalten wird. Aber mir ist klar, dass Du dies prinzipiell ebenso siehst und wir eigentlich einer Meinung sind und uns nur um ein Wording streiten.
 

mrBrown

Super-Moderator
Mitarbeiter
Das wäre eine umgangssprachliche Bedeutung, die ich nachvollziehen kann. Aber was wäre dann die Bezeichnung für eine final Instanz-Variable?

JLS 4.12.4 ist da aber zum Glück wieder ganz genau:
A constant variable is a final variable of primitive type or type String that is initialized with a constant expression (§15.29). Whether a variable is a constant variable or not may have implications with respect to class initialization (§12.4.1), binary compatibility (§13.1), reachability (§14.22), and definite assignment (§16.1.1).

Das wäre dann interessant, wenn man das "Konstante" als "contant variable" sehen würde bei der Bedeutung.

Die JLS würde ich da eher nicht zu rate ziehen, "Konstante" ist ja eher eine high-levelige Bezeichnung und kein direktes Spachkonzept, vor alle ist sowas wie static final Foo foo = Foo.BAR; (mit enum Foo) der Definition nach keine Konstante mehr.

Ich würde für nicht-statische finale Variablen auch gar keine extra Benennung einführen, sondern sie weiterhin einfach Variable nennen (je nach Kontext eben mit dem Zusatz final). Konstanten wären für mich wirklich nur statische finale Variablen, die ihren Wert auch wirklich nicht ändern auch ihren internen Zustand nicht. Sowas wie static final AtomicInteger i = ... würde ich z.B. nicht mehr als Konstante bezeichnen, auch wenn constant variable da durchaus nach JLS das passende wäre.


Wobei ich da beim Wording evtl. das durchaus anders sehe - ich versuche schon, bei der Deklaration einer Variablen auch die Initialisierung zu machen - so möglich. Einfach damit der Gültigkeitsbereich so klein wie möglich gehalten wird. Aber mir ist klar, dass Du dies prinzipiell ebenso siehst und wir eigentlich einer Meinung sind und uns nur um ein Wording streiten.
Ja, Scope immer möglichst klein und möglichst früh initialisiert :)

Ich würde aber z.B nicht sowas nutzen:
Java:
String s = null;
if (foo) {
    s = ...;
}[/icode]

Und stattdessen auf das direkt initialisieren mit null verzichten:
[code=java]
String s;
if (foo) {
    s = ...;
} else {
    s = null;
}[/icode]
 

mihe7

Top Contributor
Es ist aber doch eher unüblich, dass man finale Instanzvariablen als Konstanten bezeichnet?
Findest Du? Eine Variable, deren Wert sich nicht verändern lässt, ist für mich eine Konstante :)

Code:
#include<iostream>

class X {
public:
    const int value;

    X(int value) : value(value) {}
};

int main(int argc, char *argv[]) {
    X x(5);
    std::cout << x.value << std::endl;
    return 0;
}

Da würde ich schon sagen, dass value eine Konstante ist.
 

Neumi5694

Top Contributor
Findest Du? Eine Variable, deren Wert sich nicht verändern lässt, ist für mich eine Konstante :)
Da würde ich schon sagen, dass value eine Konstante ist.
Absolut. Der Compiler ist sogar so intelligent, im Code die Variablenzugriffe durch den Wert zu ersetzen (zumindest war er das in Java 1.4, seitdem hab ich mich darüber nicht mehr schlau gemacht). Noch konstanter geht's nicht.
Edit: Sorry, gilt nur für lokale Konstanten, nicht für die der Klasse. Aber die Definition passt trotzdem.

 

mrBrown

Super-Moderator
Mitarbeiter
Findest Du? Eine Variable, deren Wert sich nicht verändern lässt, ist für mich eine Konstante :)
Allerdings gibts die Variable gleichzeitig in X verschiedenen Ausprägungen und nicht als eine Konstante.
Instanzvariablen als Konstanten zu bezeichnen hab ich tatsächlich noch nie so gehört (selbst wenn deren Wert konstant ist und die auch nach JSL constant values sind)

Java ist eine Insel:
https://openbook.rheinwerk-verlag.de/javainsel/05_004.html#u5.4 hat gesagt.:
In Java gibt es zur Deklaration von Konstanten zwei Möglichkeiten:
  • Selbstdefinierte öffentliche statische finale Variablen nehmen konstante Werte auf.
  • [...]

Oracle (findet sich auch in den Code-Conventions wieder in Form von SCREAMING_SNAKE_CASE für Konstanten):
https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html hat gesagt.:
The static modifier, in combination with the final modifier, is also used to define constants.



Absolut. Der Compiler ist sogar so intelligent, im Code die Variablenzugriffe durch den Wert zu ersetzen (zumindest war er das in Java 1.4, seitdem hab ich mich darüber nicht mehr schlau gemacht). Noch konstanter geht's nicht.
Edit: Sorry, gilt nur für lokale Konstanten, nicht für die der Klasse. Aber die Definition passt trotzdem.
Für den Compiler ist da relevant, ob es constant values sind, das ist aber nicht wirklich eine sinnvolle Definition für Konstanten.

Der JIT kann aber am Ende eh alles mögliche machen.
 

mihe7

Top Contributor
Allerdings gibts die Variable gleichzeitig in X verschiedenen Ausprägungen und nicht als eine Konstante.
Instanzvariablen als Konstanten zu bezeichnen hab ich tatsächlich noch nie so gehört (selbst wenn deren Wert konstant ist und die auch nach JSL constant values sind)
Hm... Nach der Initialisierung nicht mehr veränderbare Instanzvariable zur Aufnahme eines kontanten Werts ist mir einfach zu lang :)
 

Blender3D

Top Contributor
Ich würde für nicht-statische finale Variablen auch gar keine extra Benennung einführen, sondern sie weiterhin einfach Variable nennen (je nach Kontext eben mit dem Zusatz final).
Was ist die Bedeutung des Wortes konstant ?
Konstant bedeutet gleichbleibend, nicht mehr veränderbar.
In Java ist die Verwendung von final aber nicht immer gleichbedeutend mit konstant.
z.B. bei einer mutable Klasse wie
[CODE lang="java" title="Test"]class Test{
private String name;
public Test( String name ){
this.name = name;
}
public void setTest( String name ){
this.name = name;
}
}[/CODE]
würde folgendes möglich sein.
[CODE lang="java" title="nicht konstant"]public static final Test test = new Test("Hallo"); // keine Konstate

...
test.setName("geändert");
...[/CODE]
allerdings handelt es sich hier per Definition um eine Konstante
Java:
public Clac{
    private final double PI = 3.14;  
    .. 
}
obwohl in diesem Beispiel aus Speichergründen selbstverständlich static verwendet werden sollte.
Nichts desto Trotz ist es eine Konstante.
 

White_Fox

Top Contributor
Ich würde für nicht-statische finale Variablen auch gar keine extra Benennung einführen, sondern sie weiterhin einfach Variable nennen (je nach Kontext eben mit dem Zusatz final). Konstanten wären für mich wirklich nur statische finale Variablen, die ihren Wert auch wirklich nicht ändern auch ihren internen Zustand nicht.
Interessante Diskussion. Aber eine Speicherstelle die ihren Wert nicht mehr ändert als Variable zu bezeichnen fände ich nur verwirrend. Und eigentlich schlicht falsch, denn was final ist soll ja ausdrücklich nicht mehr variabel sein und ich finde, statische Variable macht es nicht besser. Ist ja auch symanthisch irgendwie Unfug.
Und aus meiner Sicht sollte man für solcherlei Bewertungen Internas, die die Sprache vor dem Programmierer normalerweise verbirgt, tunlichst ignorieren. Fragen wie ob ein als final deklariertes Datum eine Konstante oder eine Variable ist müßten allein auf Basis des Quelltextes geklärt werden können. Alleine schon deshalb, weil alles darunter wieder implementierungsabhängig ist. Aber es kann ja nicht angehen daß ein final deklariertes Datum je nach JVM und Compiler mal als Konstante und mal als Variable bezeichnet werden müßte.
 
Zuletzt bearbeitet von einem Moderator:

mrBrown

Super-Moderator
Mitarbeiter
Hm... Nach der Initialisierung nicht mehr veränderbare Instanzvariable zur Aufnahme eines kontanten Werts ist mir einfach zu lang :)
Ich würde deshalb gar keinen Begriff dafür einführen :)


Was ist die Bedeutung des Wortes konstant ?
Konstant bedeutet gleichbleibend, nicht mehr veränderbar.
In Java ist die Verwendung von final aber nicht immer gleichbedeutend mit konstant.
Deshalb schrieb ich weiter oben schon, dass ich veränderbare Dinge nicht als Konstante bezeichnen würde.

allerdings handelt es sich hier per Definition um eine Konstante
Java:
public Clac{
private final double PI = 3.14;
..
}
obwohl in diesem Beispiel aus Speichergründen selbstverständlich static verwendet werden sollte.
Nichts desto Trotz ist es eine Konstante.
Deiner Definition nach. Ich hab ja schon zwei Referenzen gebracht, die das nicht als Konstante sehen würden. Und das ist ja schon deshalb keine wirkliche Konstante, weil es zur Laufzeit unendliche viele PIs gibt, man müsste nur double in Double ändern und würde es sehr deutlich sehen.

static aus “Speichergründen“ zu verwendet ist auch nahezu immer auch der falsche Weg...


Aber eine Speicherstelle die ihren Wert nicht mehr ändert als Variable zu bezeichnen fände ich nur verwirrend. Und eigentlich schlicht falsch, denn was final ist soll ja ausdrücklich nicht mehr variabel sein
Dann ist (innerhalb einer Methode) final float x = Math.random(); für dich eine Konstante?

Und aus meiner Sicht sollte man für solcherlei Bewertungen Internas, die die Sprache vor dem Programmierer normalerweise verbirgt, tunlichst ignorieren.
Deshalb würde ich das auch aus einer High-Leveligen Sicht sehen: Einmaliger Wert, der sich zur Laufzeit nicht ändert :)

Und das ist nur von static final und zusätzlich unveränderlichen Dingen erfüllt.
 
K

kneitzel

Gast
Ja, und man erkennt sehr schön, wieso ich es gut finde, wenn Begriffe eine klare Definition haben. Sobald man ohne unterwegs ist, kommt es zu solchen Diskussionen.

Ich kann beide Sichtweisen nachvollziehen. Eine klare Definition werden wir vermutlich nicht finden.

Ansonsten noch ein Danke für das Abtrennen vom Thread von @Kotelettklopfer.
 

White_Fox

Top Contributor
Dann ist (innerhalb einer Methode) final float x = Math.random(); für dich eine Konstante?
Ja. Du hast ein Datum, es wird einmal initialisiert und kann nicht mehr verändert werden. Daß der GC es bald nach dem Funktionsaufruf entsorgt würde ich auch nicht als Änderung ansehen, und wo der Wert für die Initialisierung herkommt ist zumindest mir völlig egal, aber das will ich keineswegs als allgemein verbindlich oder so durchsetzen.

Meine Sicht ist da womöglich stark davon geprägt, wie ich programmieren gelernt habe.

Edit:
Wenn ich mir das nochmal durchs Hirn ziehe ist das natürlich schon irgendwie pervers, da x bei jedem Funktionsaufruf einen anderen Wert hat. Und ich wüßte nicht das ich jemals schon irgendwo gesehen hätte, das jemand eine Konstante in einer Funktion jedesmal mit einem anderen Wert initialisiert.
Aber ich würde das tatsächlich trotzdem als Konstante betrachten. Setz den Ausdruck mal in ein Feld anstatt in eine Funktion. x ist dann immer noch in jedem Objekt anders, aber innerhalb der Klasse kann man den Ausdruck getrost als konstant betrachten.

Edit 2:
Ich habe tatsächlich gelegentlich mal darüber nachgedacht und nie verstanden, warum es das aus C bekannte const in Java nicht gibt. Nach diesem Beispiel verneige ich mich aber vor der Weisheit der Sprachdesigner.
Ich hab es nicht ausprobiert, denke aber daß das in C gehen müßte:
C:
void foo(){
    const double x = getRandomValue();
    
    //...
}

Und auch wenn ich x immer noch als Konstante ansehe muß ich sagen, daß mich das const als Übergeneralisierung auch stören würde.
 

mrBrown

Super-Moderator
Mitarbeiter
Im Scope dieser Methode ist x wohl konstant.
Deshalb würde ich zwischen "eine Variable hat einen 'konstanten' Wert" und "eine Variable ist eine Konstante" unterscheiden.


Wenn ich mir das nochmal durchs Hirn ziehe ist das natürlich schon irgendwie pervers, da x bei jedem Funktionsaufruf einen anderen Wert hat.

Eben. Es gibt dann sowohl parallel beliebig viele "Instanzen" der Kostanten, die alle unterschiedliche sind, also auch im Zeitverlauf beliebig viele unterschiedliche Ausprägungen der Konstanten.
 

White_Fox

Top Contributor
Interessant...die unterscheiden zwischen Laufzeit- und Compilerkonstanten.

Typical examples of run-time constants are values calculated based on inputs to a function, such as this C++ example:

C++:
void f(std::string s) {
  const size_t l = s.length();
  // ...
}
 

Barista

Top Contributor
Ich habe mich oft geärgert, weil irgendwelche Codeanalyse-Tools die static final Logger-Felder in Klassen gross geschrieben haben wollten, weil die Modifier static und final als Kriterium für Konstante verwendet wurden.

Ein Logger ist nun mal keine Kostante im Sinne eines Wertes, sondern ein Service(auf das Risiko hin, dass dieser Begriff in einem anderen Kontext eine andere Bedeutung haben kann und man das missverstehen kann, wenn man will), im konkreten Fall eine konstante Referenz auf einen Service.

Weil andere Projekt-Teilnehmer:innen dies nicht so sahen (was das Tool sagt ist richtig, basta) kam es teils zu Auseinandersetzungen, die auch persönlich wurden.

Mir wurde teils zugetragen, dass solche Projekt-Teilnehmer:innen an meiner Eignung für das Projekt zweifelten.

Ich habe festgestellt, dass in der Branche Intelligenz keine so grosse Rolle spielt, wie man glauben sollte, es menschelt.

Oft werden Entscheidungen/Lösungen nicht bewusst hinterfragt, sondern gewählt, sondern weil man es eben so macht (ist gerade in Mode oder macht einen professionellen Eindruck).

Dabei geht es natürlich auch um Macht und Geld, zum Beispiel dass man Arbeitskräfte, die über einen konkurrierenden Dienstleister eingekauft wurden, schlecht macht. Das ist wiederum intelligent im Sinne der persönlichen Ziele.
 

Barista

Top Contributor
Interessant...die unterscheiden zwischen Laufzeit- und Compilerkonstanten.
Ich finde schon lange, dass Konstante ein Problem mir der Initialisierung haben.

Dieser Gedanke kam mir vor allem durch die Arbeit mit C++ im letzten Jahr.
Da gibt es Konstante im Speicherlayout (static) oder auf dem Stack mit Initialiserungsschreibweise als Literal, mit runden oder mit geschweiften Klammern (eigentlich benötigt C++ mehr Code-Chars für die ganzen Sonderlocken bei Erhaltung aller Altlasten). Dazu kommt noch Copy-Semantik, Move-Semantik und In-place-Semantik.

Prinzipiell hat eine Konstante wenig wert, wenn der Inhalt undefiniert ist.

Wenn es sich also um ein Stück Speicher handelt, muss dieses Stück Speicher definiert gesetzt werden.

Bei einem primitiven, literalen numerischen Wert kann man einfach eine Zahl (oder char) hinschreiben und damit ist es erledigt.

Ein komplexes Gebilde muss in einem Zeitraum geschrieben werden, erst danach ist es konstant.

Oder es ist für den Initialisierungscode variabel, aber für jeden anderen Code read only.

Einige Programmiersprachen haben ein freeze, um dieses Problem zu lösen.

In Java, C und C++ ist das Initialisierungsproblem offen, nicht vollständig ausdefiniert.

Für alle Konstanten sollte es eine definierte Initialisierung geben, nach der nur noch read only Refrenzen existieren dürfen (Objekte) bzw. die nur noch gelesen werden dürfen (Primitive und Referenzen).

Es gibt auch noch das Problem mit der zirkulären Initialisierung final Felder in Java.

Da kann man was tricksen, denn während des Laufes des Konstruktors sind die finalen Felder beschreibbar.
Aber das ist schmutziges Arbeiten, aufgrund des offenen Initialisierungsproblems.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Das kann ich sehr gut nachvollziehen und ich sehe das mit dem Logger durchaus genau so. Bei mir ist es auch klein trotz final. Lombok handhabt das ebenso (Wobei ich jetzt nicht sicher bin, ob die es auch final machen).

Daher kann ich beide Seiten gut verstehen. Sachlich drüber reden ist ok, am Ende kommt eine Team Entscheidung wie es gewünscht wird und gut ist es.

Das weitere, was du da beschreibst, finde ich etwas befremdlich...

Edit: Noch einmal schnell geschaut: Ja, so wie angenommen: private final static Logger log = ... Wobei Logger der volle Name ist und je nach Framework auch statt Logger Log (Commons) XLogger (Slf4j) oder FluentLogger (Flogger) sein kann.
 
Zuletzt bearbeitet von einem Moderator:

LimDul

Top Contributor
Ich kann für beides Argumente verstehen - bei mir heißen static final logger allerdings LOGGER.

Ja, es sind keine Konstanten. Aber es sind statische, finale Variablen, die nur einmal existieren zur Laifzeit. Und das sehe ich sofort, dadurch das es groß geschrieben ist.

Bzgl. der Tools, das ist immer ein Trade-Off. Jedes Tool zur statischen Code-Analyse hat meist Dinge, wo die Hinweise wichtig und wertvoll sind und Dinge wo man denkt "Mein Gott, das ist nun wirklich egal!". Und da den passenden Weg zu finden, das man sinnvolle Hinweise bekommt und sich nicht mit dem unwichtigen Kleinscheiß ärgert ist nicht einfach
 
K

kneitzel

Gast
Jedes Tool zur statischen Code-Analyse hat meist Dinge, wo die Hinweise wichtig und wertvoll sind und Dinge wo man denkt "Mein Gott, das ist nun wirklich egal!".
Da ist die Vorgehensweise, die ich kenne, eben eine klare Einigung vom Team. Dann wird klar festgelegt, welche Regeln man wünscht und welche nicht (und evtl. erstellt man auch noch eigene Regeln) und dann werden genau diese festgelegten Regeln verwendet.

Bei .Net waren die Naming Standards übrigens auch begrenzt - denn da ging es nur um die API, also das, was von außen gesehen wird.
 

Barista

Top Contributor
Bzgl. der Tools, das ist immer ein Trade-Off. Jedes Tool zur statischen Code-Analyse hat meist Dinge, wo die Hinweise wichtig und wertvoll sind und Dinge wo man denkt "Mein Gott, das ist nun wirklich egal!". Und da den passenden Weg zu finden, das man sinnvolle Hinweise bekommt und sich nicht mit dem unwichtigen Kleinscheiß ärgert ist nicht einfach
Da ist die Vorgehensweise, die ich kenne, eben eine klare Einigung vom Team. Dann wird klar festgelegt, welche Regeln man wünscht und welche nicht (und evtl. erstellt man auch noch eigene Regeln) und dann werden genau diese festgelegten Regeln verwendet.
Ich bin der Meinung, dass das Auswählen der gewünschten Regeln am Problem vorbeigeht.

Wenn das Kriterium, wie im Fall static final Feld einfach falsch ist, kann man dies durch eine solche Auswahl nicht lösen.

Falsch ist eben falsch.

Mich stört der Widerspruch aus Allwissensanspruch dieser Tools und schlechtem Funktionieren dieser Tools.

Das grenzt an Betrug.

In einem Projekt, in dem ich war, wurde Sonarqube eingeführt.

Der Teamleiter hat sich dann Auswertungen anzeigen lassen und für das Beheben der wirklichen oder vemeintlichen Fehler wurden sogar Stundenschätzungen ausgegeben.

Ich hätte schreien können.

Nun zu dem Grund:

Früher hatte ich mal den Gedanken von der fachlichen Lücke, man kann eben Code meist nicht auf der Ebene der Fachlichkeit formulieren.

Irgenwann habe ich mal in diesem Buch gelesen:

Gödel, Escher, Bach - ein Endloses Geflochtenes Band Taschenbuch – 9. Dezember 2019
von Douglas Hofstadter (Autor), Philipp Wolff-Windegg (Übersetzer)

Herausgeber ‏ : ‎ Klett-Cotta; 5. Druckaufl. 2020 Edition (9. Dezember 2019)
Sprache ‏ : ‎ Deutsch
Taschenbuch ‏ : ‎ 844 Seiten
ISBN-10 ‏ : ‎ 3608949062
ISBN-13 ‏ : ‎ 978-3608949063
Originaltitel ‏ : ‎ Gödel, Escher, Bach: An Eternal Golden Braid

Ziemlich anstrengend zu lesen, allein das Vorwort hat 250 Seiten.

Die Essenz ist, dass aus einfachen Dingen komplexe Dinge werden (in der Informatik).

Man kann aus logischen Gattern einem Zähler bauen und ist plötzlich in der Welt der natürlichen Zahlen.

Also entstehen in meinem Projekt komplexe Dinge, die es nirgendwo anders gibt (Versicherungen, Rechnungen, Rabatte usw.) (falls nicht gerade jemand ein identisches Projekt macht).

Mein Lieblingsbeispiel ist der Java-Iterator:

Man sollte vor dem Aufruf von next() immer hasNext() prüfen.

Nach dem Aufruf von next() ist der Rückgabe-Wert vom vorherigen Aufruf von hasNext() ungültig.

Also kann ein statischer Code-Prüfer von Irgendwem die höhere Semantik und die daraus folgenden Probleme gar nicht kennen.

Wenn dann jemand glaubt, dass ein Tool, welches die wirklichen Probleme nicht erkennen kann, eine Stundenschätzung für deren Lösung liefern kann, dann hat der schon einen echten Schaden.
 
K

kneitzel

Gast
Falsch ist eben falsch.
Nur, wenn man das so wirklich festlegen kann!

Jetzt im Beispiel ging es um einfache Gross/Kleinschreibung. Da gibt es schlicht kein falsch.

Clean Code bedeutet, dass die, die den Code lesen können sollen, diesen möglichst gut lesen können. Und wenn das alles C Leute sind, dann mache ich auch dümmste Type-Prefixe bei jeder Variablen. Das verändert die Funktionsweise doch nicht.

Und statische Code Analyse gibt eben hier klare Regeln vor. Und viele formelle Dinge kann man nun einmal prüfen und teilweise sogar beheben. (Code Formating ist etwas, das automatisch gesetzt wird. Incl. wo wieviele Leerzeichen oder Leerzeilen sein müssen oder dürfen).
 

Barista

Top Contributor
Falsch ist eben falsch.
Nur, wenn man das so wirklich festlegen kann!
In diesem Fall ist falsch, dass anhand der Modifiers static und final darauf geschlossen wird, dass es sich um eine Konstante handelt.

Dass dies nicht zutrifft, wurde in diesem Thread bereits herausgearbeitet.

Ich nehme an, dass es in diesen Tools noch jede Menge ähnlicher Fehler gibt, habe jetzt aber keine konkreten Beispiele.

In einem Projekt in einer großen Behörde, in welchem die Architektur-Abteilung ein solches Tool als Abnahme-Kriterium für die Codierung durch einen Auftragegeber durchgesetzt hat, wurde es zur Aufgabe, dieses Tool so weit auszutricksen, dass man trotzdem die fachlichen Aufgaben erfüllen konnte. Ich kann Dir die Behörde und das Projekt nennen.
 
K

kneitzel

Gast
Oh bitte...das ist in C genauso grottenschlechter Stil wie in jeder anderen Programmiersprache.
Ich denke, diese Abart kommt eher von den IDE-Verweigerern, die stattdessen auf einen simplen Texteditor schwören.
Also einen konkreten Stil bewerten ist doch absolut nebensächlich (Aber es gibt halt Projekte, die laufen schon deutlich > 20 Jahre ... Da gelten durchaus andere Regeln und nein - damals waren die Tools noch durchaus andere ... Aber wie gesagt: Das ist erst einmal egal!). Wichtig ist aber doch, dass es auch in Deinen Augen da Wertungen gibt.

Dass dies nicht zutrifft, wurde in diesem Thread bereits herausgearbeitet.
Da haben wir ein unterschiedliches Verständnis davon, was in diesem Thread an Positionen vorhanden ist. Es ist eben nichts herausgearbeitet worden. Es gibt diverse unterschiedliche Positionen, die in meinen Augen alle ihren Standpunkt rechtfertigen konnten. Daher ist eine Aussage wie "Falsch ist Falsch" schlicht Unsinn.

Und sich mit Kollegen darüber so sehr streiten, dass es zu pers. Auseinandersetzungen kommt ist für mich absolut unverständlich. Ob die Variable nun Variable oder Konstante oder unveränderliche Variable oder sonst irgendwie genannt wird und ob diese nun log _log LOG Log oder von mir aus auch loG geschrieben wird: Das ist mir sowas von egal. Sag, wie Du es haben willst. Und wenn da noch ein Tool kontrolliert, ob es - im Sinne der Team Regeln - korrekt ist, dann um so besser.Dann sagt es mir - wenn ich es falsch machen sollte: Hey, das soll aber _loG_ geschrieben werden ... und dann ist es ein einfaches Renaming und niemand bekommt mit, dass ich das tatsächlich erst anders genannt habe.

Es ist ok, Argumente sachlich vorzutragen. Dann kann ich begründen, wieso ich es anders schreiben würde. Aber was ist denn da schon so wichtiges dran? Wenn ich als Entwickler in einem Team arbeite, dann gibt es da einfache Absprachen und an die hält man sich.
Und wenn es Vorgaben gibt, dann werden diese umgesetzt. Es mag viel Schwachfug geben. Wenn Implementations-Details vorgegeben werden, die kein Sinn machen ... aber auch da kann man nur sachlich argumentieren.

Wenn Dein Auftreten damals so war, wie es sich hier andeutet, dann können gewisse Dinge schlicht daraus resultiert sein. Das ist dann unabhängig von der fachlichen Seite. Es geht nun einmal um Teamwork.
 

Barista

Top Contributor
Und sich mit Kollegen darüber so sehr streiten, dass es zu pers. Auseinandersetzungen kommt ist für mich absolut unverständlich.
Wenn Dein Auftreten damals so war, wie es sich hier andeutet, dann können gewisse Dinge schlicht daraus resultiert sein.
Es war keine unmittelbare Auseinandersetzung, sondern es wurde in meiner Abwesenheit über meine sachlichen Äusserungen geurteilt und mir dies wiederum in Abwesenheit der entsprechenden Personen zugetragen.

Ich fand meine Äusserungen sachlich.
 
K

kneitzel

Gast
Es war keine unmittelbare Auseinandersetzung, sondern es wurde in meiner Abwesenheit über meine sachlichen Äusserungen geurteilt und mir dies wiederum in Abwesenheit der entsprechenden Personen zugetragen.

Ich fand meine Äusserungen sachlich.
Erst einmal Danke für die Klarstellung. Den Gedanken hätte ich eh nicht posten sollen denke ich mal - das ist ja alles nur ein sehr oberflächiger Eindruck und die kurzen Darstellungen erlauben keinerlei Wertung, so dass die eigentlich unterbleiben sollte. (Und es wird ja auch um deutlich mehr gegangen sein - das wurde ja aus anderen Erläuterungen von Dir deutlich (z.B. die Erläuterung, dass ein Tool / Regeln eingeführt wurden und dadurch die Arbeit massiv erschwert wurde.).
 

LimDul

Top Contributor
Ich bin ein großer Freund von sonarqube, checkstyle & spotbugs - wenn sie richtig eingesetzt werden.
sonarqube hat bei uns im Projekt schon einige sehr sehr gute Hinweise gegeben, wo Code wirklich falsch war. Und spotbugs & checkstyle meckern ebenfalls oft Dinge an, wo es sinnvoll ist was zu ändern. (Und ja, es ist auch ein komplexes Projekt - auch im Bereich Versicherungen :))

Aber - es ist extrem schwer diese Tools richtig einzusetzen. Damit solche Tools funktionieren, müssen ein paar Dinge gegeben sein:

* Das Team (Und nicht der Teamleiter oder irgendwer externer der das Akzeptanzkriterium definiert) muss dieses Tool für sinnvoll erachten. Das ist ein KO-Kriterium. Ein Tool, was vom Team nicht akzeptiert wird, bringt nix. Es sorgt für Frust, man ignoriert die Meldungen und tut nur Dinge, das die Meldungen nicht kommen - macht aber den Code nicht besser. Eine solche Einführung muss vom Team getragen und durchgeführt werden.
* Das Tool muss so konfiguriert werden, dass das Signal/Noise Ration möglichst gut ist. Alle Regeln die solche Tools haben, haben ihren Sinn - in bestimmten Kontexten. Aber dieser Kontext ist nicht immer gegeben. Und da muss man dafür sorgen, dass nur die Regeln laufen, die im eigenen Kontext sinnvoll ist. Es sollte (deswegen muss es auch vom Team getragen werden) die Bereitschaft da sein, Dinge zu ändern und sich dem Tool anzupassen. Aber das sollte nicht passieren "Weil das Tool das sagt" sondern Weil man den Mehrwert sieht und Anpassung des eigenen Vorgehens den Mehrwert erhöht. Eine Vorgabe von oben "Ihr schreibt jetzt static final Logger LOGGER" anstelle von "static final Logger logger" ist falsch. Ein gemeinsames Commitment des Teams "Wir finden, dass die Prüfung darauf, das static final Variablen immer im UPPERCASE geschrieben sind, bringt uns was und macht den Code an verschiedenen Stellen lesbarer, also schreiben wir jetzt auch static final Logger LOGGER" ist was ganz anderes. Und es gibt da kein richtig oder falsch - für beide Schreibweisen gibt es Gründe und wie man die gewichtet hängt vom Umfeld ab.
* Das Team muss Willens sein, sich und die Tools regelmäßig zu hinterfragen (Im Prinzip eine der Kern-Methodiken von agilen Vorgehen). Dinge, die sich bewährt haben, macht man weiter oder verstärkt sie, Dinge die sich nicht bewährt haben, schafft man wieder ab - ohne ideologische Scheuklappen.

Ich persönlich finde es zwar Schade wenn ein Team sich solchen Tools verweigert, weil ich sicher bin, dass sie richtig eingesetzt was bringen - aber würde bei so einem Team trotzdem drauf verzichten, weil sie dann eher schaden als nutzen.
 

LimDul

Top Contributor
Also kann ein statischer Code-Prüfer von Irgendwem die höhere Semantik und die daraus folgenden Probleme gar nicht kennen.

Wenn dann jemand glaubt, dass ein Tool, welches die wirklichen Probleme nicht erkennen kann, eine Stundenschätzung für deren Lösung liefern kann, dann hat der schon einen echten Schaden.
Zum Teil möchte ich dir widersprechen. (Wobei ich mich über die Studenschätzungen von sonarqube auch gerne amüsiere - aber komplett falsch sind sie nicht - sie sind halt ein guter Indikator, wie aufwendig die Anpassung ist)

Statische Code Analyse Tools finden selten bis nie wirklich Fehler von höherer Semantik - das unterschreibe ich voll und ganz. Dafür sind sie aufgrund ihrer Beschränktheit nicht in der Lage.

Was sie aber - richtig eingesetzt - gut können: Sicherstellen, dass der Code eine Form hat, die es überhaupt im Rahmen eines Code-Reviews ermöglicht die Fehler höherer Semantik zu prüfen.

Ich nehme mal ein paar klassische Beispiele:

Verschachtelungstiefe - Ein Tool kann nicht prüfen ob der Code korrekt ist. Aber ein Mensch kann dies auch nicht, wenn wir da 5 oder 6 ineinander verschachtelte If-Bedingungen haben. Das heißt, die Regel stellt hier nur sicher, dass der Code ein Form hat, die der Mensch verstehen kann

Gleiches gilt für die Prüfungen auf Anzahl Parameter, Länge von Methode etc. - Es werden damit keine Fehler korrigiert, aber der Code wird verständlicher, test- und wartbarer gemacht.

Und ja, manchmal führt das zu nervenden Meldungen wo das Tool einen auf die Finger klopft obwohl es vollkommen unnötig ist (so werden teilweise von Eclipse generierte equals Methoden angemeckert, weil zu komplex). Kein Ding ist schwarz oder weiß. Wenn die Regel mehr Dinge anmeckert, die man nicht ändern kann, schalte ich sie aus. Wenn sie mehr Dinge anmeckert, wo es sinnvoll was zu ändern ist, lasse sie an und überlege mir für die anderen eine Lösung. Die es ja auch gibt - über spezielle Kommentare oder suppressWarnings - sowas kann man ja auch oft in Templates & Code Generatoren einbauen, die nach meiner Erfahrung für 90% der nervenden Meldungen verantwortlich sind.
 

White_Fox

Top Contributor
* Das Team (Und nicht der Teamleiter oder irgendwer externer der das Akzeptanzkriterium definiert) muss dieses Tool für sinnvoll erachten. Das ist ein KO-Kriterium. Ein Tool, was vom Team nicht akzeptiert wird, bringt nix. Es sorgt für Frust, man ignoriert die Meldungen und tut nur Dinge, das die Meldungen nicht kommen - macht aber den Code nicht besser. Eine solche Einführung muss vom Team getragen und durchgeführt werden.
[...]
* Das Team muss Willens sein, sich und die Tools regelmäßig zu hinterfragen (Im Prinzip eine der Kern-Methodiken von agilen Vorgehen). Dinge, die sich bewährt haben, macht man weiter oder verstärkt sie, Dinge die sich nicht bewährt haben, schafft man wieder ab - ohne ideologische Scheuklappen.

Das kann man gar nicht fett genug markieren, das gilt branchenübergreifend für jedes Werkzeug einschließlich Regelwerken.

Allen voran die berüchtigte ISO-9001. Eigentlich hilfreich und nützlich da sie konstante Qualität (nicht konstant gut, es kann auch konstant schlecht sein, aber halt konstant) und Nachvollziehbarkeit sicherstellen soll, in der Praxis aber fast immer nutzlos und produziert mehr Arbeit ohne Mehrwert. Einer der wichtigsten Gründe: Weil man fast immer versucht, Vorschriften Genüge zu tun, sich aber keine oder zu wenige Gedanken darum macht was diese Vorschrift eigentlich bezwecken sollen. Ein anderer wichtiger Grund: Die wenigsten haben ein Interesse daran, sich mit einem unbekannten Werkzeg zu beschäftigen und reiten lieber mit irgendwelchen fürchterlichen Bastellösungen herum.

Beides führt dazu, das eigentich gute Regeln nur als Ballast mitgeschleppt und allenfalls geduldet und teilweise eher abgelehnt, aber nicht gelebt und genutzt werden.

So ein Blödsinn wie Exceltabellen in einem übergeordneten Verzeichnis, wo drin steht, welche Datei wo zu finden ist und natürlich händisch zu pflegen ist. Versionskontrollsysteme sind verpönt weil kompliziert, dafür wird eine Datei einfach mit dem Datum im Dateinamen neu abgespeichert. Spaßig wird es vor allem, wenn einem der Dateiexplorer darüber informiert das die Datei gestern zuletzt geändert worden ist, die Datei aber den Stand von vor einem Jahr sein soll. Oder nutzlose Excelvorlagen die mal Grundlage der Zertifizierung waren, aber jedem MA vollkommen unbekannt sind. Dergleichen Beispiele gibt es noch unzählige...und nicht selten wird sowas von den zertifizierenden Beratern vorgeschlagen, manchmal sogar explizit so gefordert, in jedem Fall wird sowas aber viel zu oft zugelassen.
 

Barista

Top Contributor
Versionskontrollsysteme sind verpönt weil kompliziert

Habe ich noch nie erlebt.

Aber das hätte ich sein können, ich bin ziemlich altmodisch, aber zum Glück gibts Anderem die sich darum reissen. Wenn man allein arbeitet klappt es mit allen Versionskontrollsystemem und in Teams gibt es immer welche, die gerne branchen.

nutzlose Excelvorlagen die mal Grundlage der Zertifizierung waren, aber jedem MA vollkommen unbekannt sind
Das kenne ich auch.
 

LimDul

Top Contributor
Mal ein kleines - Negativ Beispiel.

Wir haben hier im Projekt beim Kunden einen sonarqube. Der ist ein muss. Man muss durch die Quality Gates mit seiner Software durch hier im Haus, um in Produktion gehen zu können. Diese Quality Gates gelten für alle Anwendungen, egal wie alt, egal wo die herkommen - One Size fits it all.

Konsequenz: Das Quality Gate ist failed, wenn:
* Code Coverage < 11% oder
* Security Rating schlechter als A (Aka eine Vulnerability gefunden wird, die in 90% ein False Positive von OWASP ist)

Grandioses Quality-Gate oder?

Und - damit kein Projekt Unfug bauen kann - gilt natürlich: Das Set an Regeln ist fix und wer versucht über die normalerweise möglichen Kommentare bestimmte Prüfungen an bestimmten Codeteilen zu unterdrücken, bekommt einen Build Failed.

Wir haben aktuell 385 Code Smells, die 8 Tage und 2 Stunden Aufwand kosten zu beheben laut Sonar :)

Eine Meldung: Remove this unused "!unknown!" local variable.

Totaler Bullshit, es ist Code der Form
Java:
for (Klasse variable : liste) {
  // Mache Dinge mit variable
}
Nur leider kommt Sonar mit den verwendeten Generics da nicht klar, gibt auch lustige Exceptions vom Sonar Scanner - sprich kompletter False positiv den ich nicht wegbekomme, ohne den Code unleserlich zu machen.

117 dieser Meldungen sind
Replace the type specification in this constructor call with the diamond operator ("<>"). (sonar.java.source not set. Assuming 7 or greater.)

Tja, Problem es ist ein Code Generator der diesen Code generiert und der generiert, weil es aktuell noch notwendig ist, Java 6 kompatiblen Code.
117 Warnungen, die ich nicht wegbekomme.

Remove this unnecessary cast to "org.sonar.java.resolve.Symbols$UnknownType@360e4235".
Ebenfalls ein Problem der verwendeten Sonar Version in Zusammenhang mit Streams & Co.

So, Preisfrage: Wie oft schaue ich in Sonar rein ob der was meldet, was sinnvoll zu fixen ist?
Antwort: Nie, da ich mich durch den Müll an unnützen Meldungen wühlen muss um wirklich was zu finden. Und ich bin nun durchaus ein großer Verfechter von Sonar - und am Anfang des Projektes haben wir auch ein paar mal die sinnvollen Meldungen abgearbeitet - aber mittlerweile wird nur reingeschaut, wenn der auf die Bretter geht und deswegen der Build failed. Was so gut wie nie der Fall, weil die Messlatte so niedrig ist, dass auch jedes Uralt-Projekt im Haus darüber hüpfen kann.
 

LimDul

Top Contributor
Um den vorherigen Beitrag mal etwas zu ergänzen - wie würde es meines Erachtens richtig aussehen, wenn im Sinne von devops wir als Projekt/Team die Chance hätten, Sonar unter unserer Kontrolle zu haben:

* Die Regel mit diamond Operator fliegt raus, da die Lesbarkeit des Codes nur gering beinträchtigt ist und Änderungen am generierten Code aufwendiger wäre.
* Entweder wird geschaut, dass der Bug mit dem Sonar Scanner / Sonar Version durch ein Upgrade von irgendwas behoben wird und dann sinnvolle Meldungen kommen oder die Meldungen zu uneccessary casts & unused local variables fliegen raus - die Warnings hab ich eh in der IDE und brauche ich daher nicht in Sonar.

Damit wären bereits 146 Code Smells weg - und wir wären bei 239 Code Smells. Das halte ich schon für extrem wenig - Wir reden hier schließlich über ein Projekt mit 200k Lines of Java Code.

Und jetzt würde ich die restlichen Code Smells tatsächlich im Team durchgehen und schauen, was bekommen wir da sinnvoll weg oder gibt es noch weitere Regeln die nicht sinnvoll sind aus verschiedenen Gründen.

Und danach würden wir uns im Team ansehen, wo wollen wir hin und würden Quality Gates definieren - sowohl für neuen Code, als auch für bestehenden Code. Das wären unterschiedliche Quality Gates. Die für neuen Code wären strenger (wobei man da aufpassen, dass man da auch mit jedem neuen Code durchkommen kann), während die für den bestehenden Code so wären, dass der aktuelle Code die erfüllt, er aber nicht wirklich schlechter werden kann ohne das Quality Gate zu reißen.

Und dann bringt so ein Tool auch einen Benefit, den:
* Die Regeln sind allen klar (und nicht "Das ist hier im Haus so)
* Die Regeln sind einhaltbar (und nicht wie jetzt, Regeln die aufgrund von Umständen wie generierter Code nicht einhaltbar sind)
* Es wird gemessen und aktiv geprüft, dass man sich verbessert (Nicht wie jetzt, wo man die Quality Gates eh nie reißen kann)
 

White_Fox

Top Contributor
Habe ich noch nie erlebt.
Ich dafür schon in mehreren Firmen, aber allesamt auch keine Softwarebutzen.
Eher Firmen, deren Geschäftsführung noch die Zeiten ohne PC kennen - dafür kennen sie es, Unterlagen händisch geradezuziehen bzw. von der Sektretärin geradetippen zu lassen. Nicht daß die Geschäftsführer immer völlige Idioten waren, aber denen war die Handarbeit einfach vertraut und haben darin kein Problem gesehen. Denen war aber auch nicht klar, das man Änderungen auf totem Holz noch irgendwie nachvollziehen kann (Handschrift, Schrift verblichen oder frisch, usw), das bei Dateien aber schwieriger ist.

Und Zertifizierer sind leider auch oft solche Bolzen, die mit ihrem Kram selber nicht arbeiten müssen und dann einerseits hohe Anforderungen stellen, diese dann aber mit irgendwelchen Witzwerkzeugen erfüllen wollen.

Das mit der Exceltabelle als Ordnerinhaltsverzeichnis - so läßt sich ja besser suchen und vergleichen - war kein Scherz, war mal eine Forderung, die mein Chef dem Zertifizierer aber ausreden konnte.

Oder solche Dinge wie QM-Handbücher...bei uns ist das so gelöst, das im Ordner, wo das QM-Handbuch (lauter PDFs) liegt, einfach nur ein paar wenige Personen Schreibrechte haben.
Themen wie "Was muß ein neuer MA wissen..." sind dann halt aber ein Problem, weil die Kommunikation einfach immer irgendwo klemmt.
Ich persönlich würde ja, um auch mal einen konstruktiven Vorschlag zu bringen, für sowas ein Wiki aufsetzen. Ein neuer MA hat die Aufgabe, die ersten vierzehn Tage den "Was muß ein neuer MA wissen..."-Artikel zu reviewen und Lücken, die ihm auffallen, zu schließen.
Überhaupt würde ich den ganzen QM-Handbuchkram in ein Wiki kippen. Zu jedem Programm, das in der Firma häufig genutzt wird, gehört ein Wiki-Artikel, der Anleitungen, nützliche Vorgehensweisen, bekannte Probleme, usw. enthält.
Produkte, Testanweisungen, Schaltpläne...kann da auch rein.

Ich habe mal in einer Firma gearbeitet, wo der Geschäftsführer irgendwann mal ein Wiki aufgesetzt hat, aber niemand hat es genutzt. Unser Teamleiter hat dann irgendwann angeordnet, daß wir abteilungsintern jetzt alles Mögliche wie Kabelpläne, Anleitungen, usw. ins Wiki reinkippen und es nutzen wo immer es sinnvoll erscheint.
Die Firma war in vielerlei Hinsicht bekloppt, aber das mit dem Wiki fand ich richtig gut und nützlich.
 

Blender3D

Top Contributor
Deshalb würde ich zwischen "eine Variable hat einen 'konstanten' Wert" und "eine Variable ist eine Konstante" unterscheiden.
Variable bedeutet veränderbar. Konstante bedeutet nicht veränderbar.
Das Wording eine konstante Variable ist also eine Kontradiktion.
Korrekt ist es aber zwischen Konstanten und Variablen zu unterscheiden.
 

LimDul

Top Contributor

mrBrown

Super-Moderator
Mitarbeiter
Java kennt nach JLS eben nur Variablen. Wenn es dir besser gefällt können wir aber auch gerne einen neuen Kunstbegriff für "Variablen", die konstant sein können oder auch nicht, einführen:
"Deshalb würde ich zwischen 1) "ein Füddelbüh hat einen 'konstanten' Wert" und 2) "ein Füddelbüh ist eine Konstante" unterscheiden."

1) wären zB alle lokale "final variables" oder Instantvariablen, die als final definiert sind
2) wäre static final
 

mihe7

Top Contributor
Das ist mal - im Sinne der JLS eindeutig falsch
Das ist das Grundproblem an der Sache: man kann ganz unterschiedliche Maßstäbe anlegen (s. auch den oben verlinkten Wiki-Eintrag):
  • ja, das ist eine Variable, schließlich nimmt sie einen Wert an und der kann im Prinzip unterschiedlich sein.
  • nein, das ist keine Variable, schließlich kann der Wert nach der Initialisierung nicht mehr verändert werden.
  • alles, was einen Wert aufnehmen kann, ist eine Variable. Es gibt dann auch "konstante Variablen", was sprachlcih irgendwo paradox ist: "konstante Veränderliche"
  • usw.
Weil unterschiedliche Maßstäbe halt auch unterschiedliche Antworten ermöglichen, muss man sich halt ggf. auf eine Bedeutung einigen, wobei ich hier nicht sehe, dass es zu großartigen Problemen kommen könnte, zumindest wenn man den Kontext berücksichtigt.

Ob jetzt jemand "finale Variable", "konstante Variable" oder "Konstante" sagt, ist mir egal - wobei man mit "finale Variable" in Sprachen ohne final-Schlüsselwort wohl eher auf große Augen stoßen dürfte :) EDIT: oder auch nur "Variable", Hauptsache ist doch, dass klar ist, wovon man spricht.
 

mrBrown

Super-Moderator
Mitarbeiter
Um das, was ich meine, etwas anschaulicher zu machen:

Wenn vor mir fünf 1-Liter Flaschen auf dem Tisch stehen, ist deren Volumen konstant*, wenn auch in jeder Flasche durch Produktionsbedingungen leicht unterschiedlich. Ich würde aber keines der Volumen als "Konstante" bezeichnen.
Das definierte Volumen von genau einem Liter (abgeleitet aus Sekunden und Lichtgeschwindigkeit) würde ich aber durchaus als Konstante bezeichnen.


(*unter den üblichen Physik-Beispiel-Bedingungen mit exakt definiert und nicht veränderlich Bedingungen)
 

mrBrown

Super-Moderator
Mitarbeiter
Das ist eben in Java, mangels const nicht immer ganz einfach. Siehe #9
Wie das entsprechende Keyword heißt, ist dabei aber wirklich völlig egal.

Bis auf die Erwähnungen der JLS könnte man die gleiche Diskussion auch für JavaScript führen, dort gibt es const...

Deswegen fand es unser Prof. gerade in Java wichtig zwischen konstanten und variablen Ausdrücken unterscheiden zu können.
Und dann hat er euch nicht erklärt, dass constant expressions noch mal was völlig anderes sind? ;)
 

mihe7

Top Contributor
Das ist eben in Java
Das ist, denke ich mal, auch das Problem der Diskussion.

Wie bilde ich eine Realwelt-Konstante in Java ab? Antwort: static final. Daraus folgt jedoch nicht, dass ausschließlich und alle static finals Realwelt-Konstanten sein müssen.

Im Quelltext heißt Variable für mich einfach Veränderliche und Konstante Unveränderliche. Verwende ich einen Bezeichner, um einen veränderlichen Wert zu referenzieren, habe ich eine Variable, verwende ich einen Bezeichner, um einen unveränderlichen Wert zu referenzieren, habe ich eine Konstante.
 

mihe7

Top Contributor
Vielleicht, um das nochmal zu verdeutlichen:
Java:
public void print(final String text) {
...
}
Im Kontext der Parameter würde ich hier einfach von (""|"konstanten"|"final"|"unveränderlichen") Parameter sprechen. Für den Code in der Methode ist text einfach eine Konstante.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Wo am besten eine String Konstante initialisieren? Java Basics - Anfänger-Themen 5
H Führende Nullen in Abhängigkeit von der Stellenanzahl einer Konstante Java Basics - Anfänger-Themen 4
X Konstante hinzufügen Java Basics - Anfänger-Themen 3
F konstante/variable Attribute? Java Basics - Anfänger-Themen 3
C Datentypen Array-Konstante Java Basics - Anfänger-Themen 4
T Variablen und Konstante ausserhalb des Programmcodes Java Basics - Anfänger-Themen 2
T ist enum.ordinal keine Konstante? Java Basics - Anfänger-Themen 7
P Value einer Konstante lesen Java Basics - Anfänger-Themen 2
E Konstante überschreiben Java Basics - Anfänger-Themen 6
-horn- Natur- & andere Konstante überall zugreifbar? Java Basics - Anfänger-Themen 10
E Frage zu Konstante Java Basics - Anfänger-Themen 10
D Konstante deklariert wie Methode übergebe? Java Basics - Anfänger-Themen 5
S String Konstante kann nicht fuer Annotation verwendet werden Java Basics - Anfänger-Themen 2
G Konstante im Konstruktur initialisieren Java Basics - Anfänger-Themen 8
A Konstante garnicht konstant? Java Basics - Anfänger-Themen 3
L String konstante Länge? Java Basics - Anfänger-Themen 4
G JFrame - Konstante größe? Java Basics - Anfänger-Themen 5
J Konstante von Klasse zu Klasse übergeben? Java Basics - Anfänger-Themen 6
Dilandau konstante eigene farben im programm definieren Java Basics - Anfänger-Themen 13
A Konstante/Klassenkonstante Java Basics - Anfänger-Themen 1
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
Ostkreuz Java Docs Java Basics - Anfänger-Themen 9
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32

Ähnliche Java Themen

Neue Themen


Oben