Best Practice Parameter int vs byte

D

DrPils

Mitglied
Moin
Ich frage mich ob es sinn macht in den Paramatern von Methoden oder Konstruktoren kleinere primitive Typen als int zu schreiben.
Wie mir im Chat schon gesagt wurde, spricht eigentlich nur der benötigte Speicherplatz dafür. Auch wenn Speicher heute kein Problem mehr darstellt sollte es nicht ein Ziel von gutem Code sein, den Speicher effizient zu nutzen. Kleinvieh macht ja bekanntlich auch Mist. Es wurde auch erwähnt, dass wegen Alignment oftmals der Speicherplatz nicht dagegen spricht. Wäre nett wenn mir das noch jemand erläutern könnte.
Was wohl dagegen spricht ist, dass man bei literalen als Parameter immer casten muss, was meiner Meinung nach zu unleserlichen Code führt.

Java:
class Cat {

    byte age;

    Cat(byte age) {
        this.age = age;
    }

    public static void main(String[] args) {
        Cat cat = new Cat((byte) 4);
    }
}
 
M

mrbela

Bekanntes Mitglied
Hey.
Prinzipiell spricht nichts dagegen kleinere Datentypen zu verwenden.. Im Prinzip muss man das aber so lange nicht machen, wie die Performance Deines Programms nicht drunter leidet.. Schreibst Du bspw. 1000-2000 Zahlen, dann würde ich auf jeden Fall schauen, ob es ein kleinerer Datentyp auch tut. Schreibst Du 5-10, dann muss man sich die Arbeit nicht machen.
Falsch ist es aber natürlich nie!

Was wohl dagegen spricht ist, dass man bei literalen als Parameter immer casten muss, was meiner Meinung nach zu unleserlichen Code führt.
Das verstehe ich nicht ganz.. Wo genau musst Du casten?
 
M

mrbela

Bekanntes Mitglied
Ah, das hattest Du eben noch nicht drinnen. ;)

Ja, in der Tat musst Du da casten, da Java quasi ein Ganzzahl-Literal (bspw. einfach nur die 4 immer als int betrachtet)..
Das liegt wahrscheinlich daran, dass in den meisten Fällen ein int doch am besten ist. Daher muss man, wenn man davon abweichen möchte casten (betrifft ja auch long's, also wenn man den Wertebereich noch erweitern möchte).
 
T

thecain

Top Contributor
int verwenden, wenn das nicht reicht long... für byte gibt es wenig Gründe. Und beim Alter würde ich es sicher nicht verwenden. Da sparst du auch nicht wirklich was, bei normaler Verwendung.
betrifft ja auch long's
Longs muss man nicht casten, ein Long literal kann mit 12L angegeben werden.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Generell solltest du die Typen nutzen, die am besten Ausdrücken, was du aussagen möchtest. In diesem Fall machen das, mMn, byte und int gleich gut, von daher würde ich int nutzen (ua weil es int-Literale gibt, um Gegensatz zu byte, und das bei Rechenoperationen immer mit int gerechnet wird (abgesehen von long und float/double)).
Besser wäre es u.U., eine extra "Alter"-Klasse (oder "Jahre", oder genereller etwas wie "UnsignedInteger") einzuführen, die drückt dann genauer aus, was du aussagen willst, und kann zusätzlich zB sicherstellen, dass es immer positiv ist.



Der Speicherplatz-Bedarf von byte vs int lässt sich nur relativ schwer eindeutig festlegen. Obige Klasse braucht zB genauso viel Platz, wenn man int benutzten würde. Das kann man im Hinterkopf behalten, sollte aber nicht grundsätzlich erste Priorität haben.


Dass der Cast dort nötig ist überrascht mich grad (@mihe7, @httpdigest, @JustNobody vielleicht einer von euch warum der nötig ist?), byte b = 4; wäre zB problemlos möglich, hätte erwartet, dass es gleichermaßen für Parameter funktioniert.
 
L

LimDul

Top Contributor
Auch wenn Speicher heute kein Problem mehr darstellt sollte es nicht ein Ziel von gutem Code sein, den Speicher effizient zu nutzen. Kleinvieh macht ja bekanntlich auch Mist.
An der Stelle würde ich gerne einhaken. Das Argument ist nämlich sowohl richtig als auch total falsch.

Das Ziel von guten Code sollte es sein, dass er lesbar, wartbar und verständlich ist. Speicherplatz sollte in der Regel erst danach kommen (Außer ich bin auf Umgebungen wie z.B. Embedded Umgebungen unterwegs, wo Speicherplatz wirklich knapp ist).

Es gibt ein schönes Zitat von Knuth, was sich zwar mehr auf die Performance Optimierung bezieht, aber hier genauso gut passt: "Premature Optimization Is the Root of All Evil".

Kleinvieh macht zwar auch Mist, aber wenn du an 100 Stellen je 3 byte einsparst dafür aber die Stelle übersiehst, wo du 1 Megabyte Speicher verschwendest hast du eben nichts gewonnen. Und genauso wie bei den Laufzeiten ist beim Speicher in der Regel nicht die Frage byte vs. int vs. long ein Problem - sondern die Verwendung von Listen, das z.B. aus einer Datenbank mal alles geladen wird, obwohl man nur ein paar Attribute braucht etc. Sprich du verschwendest deine Zeit an Stellen zu optimieren, wo der Nutzen minimal ist.

Es ist richtig, keinen Speicher zu verschwenden - aber die Stellen, die man so optimiert sind nie das Problem.
 
M

mrbela

Bekanntes Mitglied
Dass der Cast dort nötig ist überrascht mich grad (@mihe7, @httpdigest, @JustNobody vielleicht einer von euch warum der nötig ist?), byte b = 4;wäre zB problemlos möglich, hätte erwartet, dass es gleichermaßen für Parameter funktioniert.

Bei byte b = 4 findet eine automatische verkleinernde Konvertierung (siehe Narrowing Primitive Conversion) statt.

Bei Aufrufen von Methoden gibt eine solche verkleinernde Konvertierung nicht, wohl aber eine vergrößernde, siehe Method Invocation Conversion.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Bei byte b = 4 findet eine automatische verkleinernde Konvertierung (siehe Narrowing Primitive Conversion) statt.

Bei Aufrufen von Methoden gibt eine solche verkleinernde Konvertierung nicht, wohl aber eine vergrößernde, siehe Method Invocation Conversion.
Ok, lass mich die Frage anders formulieren: warum ist es bei Methodenaufrufen nicht die gleiche Ausnahme wie bei Zuweisungen möglich: https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2 ?

(Potentielle Probleme bei Überladung mit allen primitiven?)
 
M

mrbela

Bekanntes Mitglied
Ok, lass mich die Frage anders formulieren: warum ist es bei Methodenaufrufen nicht die gleiche Ausnahme wie bei Zuweisungen möglich: https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2 ?

(Potentielle Probleme bei Überladung mit allen primitiven?)
Puh.. :D Das ist eine sehr gute Frage!

Denke fast dass es damit zusammenhängt:
byte b = 4 (btw, wie geht hier nochmal die Inline-Formatierung?) wird zur Compile-Zeit konvertiert. Das geht nur, da die Werte hier konstant sind:

"A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable."
https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2

Bei Aufrufen von Methoden gilt das nicht, Stichwort "Dynamische Bindung".

Denke das wird es sein, was meinst Du?
 
mihe7

mihe7

Top Contributor
Ok, lass mich die Frage anders formulieren: warum ist es bei Methodenaufrufen nicht die gleiche Ausnahme wie bei Zuweisungen möglich: https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2 ?

(Potentielle Probleme bei Überladung mit allen primitiven?)
Steht in 5.3: Neither strict nor loose invocation contexts include the implicit narrowing of integer constant expressions which is allowed in assignment contexts. The designers of the Java programming language felt that including these implicit narrowing conversions would add additional complexity to the rules of overload resolution (§15.12.2).
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
D

DrPils

Mitglied
Ah, das hattest Du eben noch nicht drinnen. ;)
Doch war drinnen :p

Der Speicherplatz-Bedarf von byte vs int lässt sich nur relativ schwer eindeutig festlegen. Obige Klasse braucht zB genauso viel Platz, wenn man int benutzten würde. Das kann man im Hinterkopf behalten, sollte aber nicht grundsätzlich erste Priorität haben.
Das ist Interessant. Wieso ist der Speicherplatz der gleiche? Haben Objekte auf dem Heap einen Minimum Speicherplatz der belegt wird? Anders kann ich mir das sonst nicht erklären. Dachte bisher der Speicherplatz setzt sich einfach aus der Summe der Attribute eines Objekts zusammen.

Ansonsten danke für die zahlreichen Beiträge.
Mir ging es jetzt nicht genau um das Attribut age in Cat, sondern generell gesehen. Das war jetzt nur ein Beispiel
 
mihe7

mihe7

Top Contributor
Normalerweise wird der Speicher an 4 bzw. 8-Byte-Grenzen ausgerichtet (man hat also kleine "Seiten" mit 4/8-Byte Größe), weil sowieso 4/8-Byte über die Leitung gehen. Das ist so ähnlich wie bei Dateisystemen: da belegt eine Datei mit einem Byte auch immer eine volle "Zuordnungseinheit".
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Das ist Interessant. Wieso ist der Speicherplatz der gleiche? Haben Objekte auf dem Heap einen Minimum Speicherplatz der belegt wird? Anders kann ich mir das sonst nicht erklären. Dachte bisher der Speicherplatz setzt sich einfach aus der Summe der Attribute eines Objekts zusammen.
Jein - du hast grundsätzlich schon Recht, der Speicherplatz setzt sich aus der Summe der Attribute zusammen. Dazu kommt aber der Objekt-Header (zb welche Klasse ist es grad, je nach System ist das unterschiedlich groß, etwa 12* Byte kommen meist hin), und das ganze wird dann "aufgerundet" auf meist 8* Byte (nennt sich Padding).

Um das einmal grob darzustellen:

Attributeechte Größe der Attributeinklusive Objekt-Header (a 12Byte)Padding auf 8 Byte
1 byte11316
1 int41616
2 byte21416
2 int82024
4 byte41616
4 int162832
1 int + 1 byte51724


* Die Werte sind je nach System und Startoptionen unterschiedlich, für den Header sind 8 (auf 32bit-Sytemen) bzw 12 oder 16 Byte möglich, und das Padding lässt sich einstellen, Standardmäßig ist es auf 4 (auf 32bit-Systemen) bzw 8 Byte.

Und mit zukünftigen Java-Versionen ändert sich da auch nochmal, zB mit inline-classes (aka value-classes aka vielleicht primitive-classes)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
L Wie greife ich in der Subklasse auf die Parameter einer Methode der Superklasse zu ? Java Basics - Anfänger-Themen 15
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
J Apache Poi - createCell() Methode akzeptiert keinen Index aus for-schleife als Parameter Java Basics - Anfänger-Themen 4
P Parameter auf Datenformat überprüfen Java Basics - Anfänger-Themen 5
S Hamster Simulator rechnen lernen Parameter int Java Basics - Anfänger-Themen 6
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
C Java Methoden "Parameter" Problem Java Basics - Anfänger-Themen 16
W Parameter solange addieren bis 13 auftaucht Java Basics - Anfänger-Themen 11
L OOP Parameter mit der Draw-Methode übergeben Java Basics - Anfänger-Themen 11
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
L Methoden Übergabe von Parameter Java Basics - Anfänger-Themen 3
R Zu viele leere Parameter Java Basics - Anfänger-Themen 8
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 3
B Klassen Array Parameter im Konstruktor? Java Basics - Anfänger-Themen 4
V Unbekannte Parameter Java Basics - Anfänger-Themen 1
J Input/Output Input als Parameter an Methoden übergeben Java Basics - Anfänger-Themen 23
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
A festgelegte Parameter Java Basics - Anfänger-Themen 11
PaperHat Methoden als Parameter anderer Methode verwenden Java Basics - Anfänger-Themen 11
H Interface Final für Parameter in überschriebenen Methoden? Java Basics - Anfänger-Themen 3
P Variablen Optionaler Parameter auf der Kommandozeile Java Basics - Anfänger-Themen 12
S Variable Parameter Java Basics - Anfänger-Themen 5
L Variablen Parameter bekommen Java Basics - Anfänger-Themen 13
M Methode mit Array als Parameter an Main übergeben Java Basics - Anfänger-Themen 1
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
B Webservice -> alle parameter bekommen von form Java Basics - Anfänger-Themen 2
K Klassenmethode mit übergebenen Parameter speichern Java Basics - Anfänger-Themen 7
I BigDecimal als Parameter verwenden Java Basics - Anfänger-Themen 3
J Parameter in main verwenden Java Basics - Anfänger-Themen 3
J Programm was üer Runtime.getRuntime gestartet wird erkennt String Parameter nicht Java Basics - Anfänger-Themen 0
G Int-Array im Konstruktor Parameter Java Basics - Anfänger-Themen 37
T Parameter das übergeben wurde ändern? Java Basics - Anfänger-Themen 1
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
P Operatoren Parameter nicht auf null geprüft? Java Basics - Anfänger-Themen 16
D Name eines JMenue als Parameter übergeben Java Basics - Anfänger-Themen 20
K Dynamischen Supplier für Parameter Java Basics - Anfänger-Themen 12
C Methoden Welche JSoup Methoden Und Parameter für diese HTML Tags Java Basics - Anfänger-Themen 4
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
W Methoden Methode ohne Parameter auf Instanz eines Objekts aufrufen? Java Basics - Anfänger-Themen 14
M Methode mit Parameter Java Basics - Anfänger-Themen 4
G Objektübergabe durch Parameter Java Basics - Anfänger-Themen 3
J Erste Schritte catch Exeption Parameter Java Basics - Anfänger-Themen 7
A Erste Schritte Methoden mit Parameter Java Basics - Anfänger-Themen 2
D Statische Objekte mit variablem Parameter Java Basics - Anfänger-Themen 1
N Klassen Klassen zwingende Parameter mitteilen Java Basics - Anfänger-Themen 4
L Methoden Methode Parameter vertauschen? Java Basics - Anfänger-Themen 3
C Auswertung Ausdruck mit Punknotation + Objekt als Parameter Java Basics - Anfänger-Themen 3
A Methoden Parameter optionalisieren möglich? - Wie? Java Basics - Anfänger-Themen 19
N Beliebig viele parameter Java Basics - Anfänger-Themen 3
F Methoden: Referenzvariable als Parameter Java Basics - Anfänger-Themen 4
J HttpGet Parameter mitgeben Java Basics - Anfänger-Themen 5
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
T Klasse von erfahren wenn Obertyp Parameter ist Java Basics - Anfänger-Themen 6
J Klassen Fehler mit Parameter des Konstruktors bei einer Objekterzeugung Java Basics - Anfänger-Themen 5
V Parameter in synchronized-Blöcken verstehen Java Basics - Anfänger-Themen 2
M Klasse als Parameter übergeben Java Basics - Anfänger-Themen 7
S Methoden eine Instanz einer eigenen Klasse als parameter übergeben Java Basics - Anfänger-Themen 9
T unterschiedlich viele parameter übergeben Java Basics - Anfänger-Themen 5
V Methoden key value Parameter Java Basics - Anfänger-Themen 11
J Drucker parameter ändern Java Basics - Anfänger-Themen 9
F trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 0
O Basisklassen als Methoden-Parameter ähnlich, wie in C++ ? Java Basics - Anfänger-Themen 6
D GregorianCalendar als Parameter Java Basics - Anfänger-Themen 2
M Parameter von Konstruktor, der Superklassen-Konstruktor aufruft Java Basics - Anfänger-Themen 2
E Problem beim Übergeben von Parameter an Methode Java Basics - Anfänger-Themen 2
O ArrayListe sortieren anhand zweier Parameter Java Basics - Anfänger-Themen 4
S Methoden Rückgabewert einer Methode als Parameter an eine andere Methode übergeben, geht das? Java Basics - Anfänger-Themen 5
D Enum als Parameter Java Basics - Anfänger-Themen 6
T In main-Methode Parameter übergeben Java Basics - Anfänger-Themen 3
M Methode als Parameter übergeben Java Basics - Anfänger-Themen 16
Joew0815 Methoden Objekt als Methoden-Parameter - Kein call-by-reference? Java Basics - Anfänger-Themen 12
T Parameter in Eigner Konsole Java Basics - Anfänger-Themen 2
ElfterDoktor Einen Objekt Attribute/Parameter geben & Auslesen Java Basics - Anfänger-Themen 4
R Erste Schritte Unterschied Array-Parameter zu Array als Parameter? Java Basics - Anfänger-Themen 7
HoloYoitsu args-Parameter durchschleifen (Schnittstelle erweitern?) Java Basics - Anfänger-Themen 27
B 'kosten' Parameter? Java Basics - Anfänger-Themen 9
C Warning: Type safety: Potential heap pollution via varargs parameter array Java Basics - Anfänger-Themen 5
V Dateipfad als Parameter übergeben Java Basics - Anfänger-Themen 3
E Methoden Objekttyp als Parameter Java Basics - Anfänger-Themen 2
C Parameter bei Methoden Java Basics - Anfänger-Themen 4
N Verschiedene Klassen als Parameter elegant übergeben? Java Basics - Anfänger-Themen 4
T OOP Bei Objekterstellung Parameter mitgeben Java Basics - Anfänger-Themen 4
P Methoden Reflections: getMethod()-aufrufen ohne Parameter-Angabe Java Basics - Anfänger-Themen 5
masii Methoden Parameter casten? Java Basics - Anfänger-Themen 2
S Javaprogramm mit Parameter starten? Java Basics - Anfänger-Themen 21
R New als Parameter Java Basics - Anfänger-Themen 3
D Parameter einlesen CMD - Problem Java Basics - Anfänger-Themen 2
D Erste Schritte Parameter eingeben Java Basics - Anfänger-Themen 6
A Kommandozeilen-Parameter Java Basics - Anfänger-Themen 6
P Objekte übergeben Parameter vs. Static Methode Java Basics - Anfänger-Themen 7
S Methoden Enum Parameter in Methode Java Basics - Anfänger-Themen 7
G Parameter an main(String[] args) übergeben Java Basics - Anfänger-Themen 6
S Erste Schritte Variable Parameter an JAR übergeben Java Basics - Anfänger-Themen 10
H Methoden Methode veränder Parameter Java Basics - Anfänger-Themen 4
G OOP Parameter Matrix Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Anzeige

Neue Themen


Oben