packages, public methods, assertions und argumentchecking.

Status
Nicht offen für weitere Antworten.

-frank

Bekanntes Mitglied
(der threadtitel ist eventuell nicht sehr aussagekräftig, aber mir fällt kein besserer ein.)

ich habe in meinem programm etliche packages. zum beispiel gibt es ein package meinprog für die logik, dann meinprog.gui für die userinterface klassen und dann noch unterpackages wie meinprog.gui.something. nun kann es zum beispiel sein, dass es in einer klasse im meinprog-package eine methode à la createNewSomething(String title, Object value) gibt. title und value dürfen nicht null sein. die methode deligiert das ganze weiter an eine klasse aus meinprog.ui, welche dieselbe Methode anbietet. schließlich gibts in meinprog.ui.something (neben vielen anderen Klassen) eine Klasse Something mit dem entsprechenden Konstruktor oder eine SomethingFactory oder sowas.

worauf ich hinaus will: ich habe hier 3 mal das title argument und 3 mal das value argument. ich habe in der doku der methoden/konstruktoren erwähnt, dass die werte nicht null sein dürfen. meine frage lautet nun wo/wie/wie oft ich die null-überprüfung machen soll?
derzeit habe ich in jeder dieser methoden zu beginn eine zeile à la
Code:
if (value == null) throw new IllegalArgumentException(...);

nun bin ich gerade dabei, einige teile meines codes auf assertions umzustellen. es gilt aber der grundsatz, dass man die argumentüberprüfung von public methoden nicht mit assertions machen soll (bei private/protected aber sehr wohl). das leuchtet mir ein. hier steckt wohl die intention dahinter, dass clients aussagekräftige fehlermeldungen bekommen sollen, wenn sie falsche argumente übergeben. bei mir ist es aber so, dass zb das subpackage something zwar aus meiner sicht durchaus sinnvollerweise ein eigenes package ist, aber ich eigentlich nicht davon ausgehe, dass es jemals ohne meinprog.ui sinn machen wird. für mich ist also quasi das ganze package "protected". viele methoden muss ich aufgrund der unterschiedlichen packages aber nun public machen.
soll ich in solchen fällen nun weiterhin mehrmals die checks ausführen? soll ich gegen die regel mit assertions arbeiten? oder soll ich in einigen methoden ganz auf die checks verzichten?

mein hauptproblem sind die subpackages bzw. wie ich sie verwende (eventuell liegt auch hier der fehler). ich habe zb ein package mit 20 files. dann sehe ich, dass 10 klassen eigentlich nur für eine 11. klasse da sind (--> zb Klasse Something) --> neues sub-package something. macht aus meiner sicht absolut sinn, ist zb auch viel übersichtlicher. durch das neue package entstehen aber eben public methoden, die vorher keine waren, was zur folge hat, dass ich zb laut den assertion-conventionen in diesen public methoden ausführliche fehlerüberprüfung machen muss, entsprechende doku, etc.
war es nun von vorneherein ein fehler ein "subpackage" zu machen? warum gibt es eigentlich keine "echten" "subpackages", wo dieses sichtbarkeits problem nicht auftritt? (wäre das nicht durchaus nützlich?)

eine weitere frage: soll ich auf null überprüfen, wenn java ohnehin ein paar zeilen später eine nullpointer exception werfen würde? ich persönlich finde es schöner und von daher mache ich es auch (besonders weils durch codeänderungen ja schnell mal vorkommen kann, dass die nullpointerexception plötzlich erst viel später geworfen wird). allerdings braucht selbst ne null-überprüfung etwas zeit und auch wenn die in meinem fall selbst in schleifen kein performance-problem darstellen sollte, so wären nach meinem verständnis dann doch assertions besser geeignet. aber die darf ich laut konvention ja nicht verwenden...

hab ich hier irgendnen denkfehler?
 

Wildcard

Top Contributor
Ich denke das Problem kannst du mit einer Nameskonvention erschlagen.
Sagen wir die Klassen in package com.example.subpackage sind 'erzwungen' public weil du das für den Zugriff brauchst, jedoch kein Teil der Public API.
Nenn das Package einfach com.example.subpackage.internal, damit ist die Sache klar.
 

-frank

Bekanntes Mitglied
Wildcard hat gesagt.:
Ich denke das Problem kannst du mit einer Nameskonvention erschlagen.
Sagen wir die Klassen in package com.example.subpackage sind 'erzwungen' public weil du das für den Zugriff brauchst, jedoch kein Teil der Public API.
Nenn das Package einfach com.example.subpackage.internal, damit ist die Sache klar.

auf die idee wär ich nie gekommen ;)
auf jeden fall eine überlegung wert, danke!
 

Wildcard

Top Contributor
Im Eclipse Kosmos wird das Problem übrigens auch auf diese Art gelöst.
In Java selbst stellen die sun Packages das entsprechende Pendant.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T javax.script (JavaScript): Nicht-JRE-Packages importieren/nutzen Allgemeine Java-Themen 4
B Verwendung von Packages im Java Code Allgemeine Java-Themen 10
G Gleiche Packages in verschiedenen JAR Dateien - Welches Package wird verwendet? Allgemeine Java-Themen 5
G Manifest mit Packages versehen Allgemeine Java-Themen 2
C Alle Klassen eines Packages lesen und instanzieren? Allgemeine Java-Themen 9
D Packages in ausführbaren Jars Allgemeine Java-Themen 4
Apo Zur Laufzeit Klassen mit Packages laden? Allgemeine Java-Themen 2
D Inhalt eines Packages im Code verarbeiten Allgemeine Java-Themen 18
@ Javadoc: Kurzbeschreibung Packages Allgemeine Java-Themen 10
L Fehlende Teile des javax Packages Allgemeine Java-Themen 3
J Packages in Java Allgemeine Java-Themen 2
M auf files des packages zugreifen Allgemeine Java-Themen 2
B Fremde Packages benutzen? Allgemeine Java-Themen 11
G Aufbau der Packages Allgemeine Java-Themen 3
B Installation neuer Packages Allgemeine Java-Themen 8
D defaultpackage-Klassen in anderen Packages aufrufen Allgemeine Java-Themen 2
L Zugriffsschutz: protected und packages Allgemeine Java-Themen 6
M Classen eines Packages ermitteln Allgemeine Java-Themen 12
R Klassendesign in Packages Allgemeine Java-Themen 7
M problem mit packages - falsche einstellungen? Allgemeine Java-Themen 2
T Packages Allgemeine Java-Themen 9
S Problem bei Umstellung von (default package) auf Packages Allgemeine Java-Themen 10
J jar Datei mit Packages Allgemeine Java-Themen 30
A geladene Packages ermitteln Allgemeine Java-Themen 2
M Java2exe Externe Packages einbinden! .JAR und sowas Allgemeine Java-Themen 7
G Classpath, Packages und Import Allgemeine Java-Themen 3
I Liste aller bekannten Packages Allgemeine Java-Themen 6
H Problem mit Packages Allgemeine Java-Themen 11
Bionic Packages einbinden ?! Allgemeine Java-Themen 4
S outlook ähnliche leiste und sonstige packages Allgemeine Java-Themen 2
A Packages Allgemeine Java-Themen 2
G Public oder Private oder Protected Sinn Allgemeine Java-Themen 14
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
T Abgeleitetes Interface public ohne Schlüsselwort "interface"? Allgemeine Java-Themen 3
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
I Java: public final Werte: Gute oder schlechte Praxis? Allgemeine Java-Themen 6
C Email mit public-key verschlüsseln Allgemeine Java-Themen 0
W Warum muss void main() public sein? Allgemeine Java-Themen 3
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
Thallius Warum ist meine private porperty public? Allgemeine Java-Themen 7
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
B public class JarFilter extends FileFilter « Falsch? Allgemeine Java-Themen 4
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
J public array? Allgemeine Java-Themen 5
N Polygon Klasse mit public Membern Allgemeine Java-Themen 4
P Private und public Allgemeine Java-Themen 2
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
V Public SVN benutzen? Allgemeine Java-Themen 11
D public boolean return Allgemeine Java-Themen 8
O Methoden in abstrakter Klasse: public oder protected? Allgemeine Java-Themen 16
lumo Row Header ist public, zeigt die funktion aber nicht public Allgemeine Java-Themen 8
MQue public void serialEvent(SerialPortEvent event) Allgemeine Java-Themen 4
M public class Cannix() Allgemeine Java-Themen 5
G Probleme bei String Übergabe um Public Key zu erzeugen ? Allgemeine Java-Themen 6
M ist "public abstract class * extends" möglich? Allgemeine Java-Themen 2
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
T public void init wird nicht aufgerufen Allgemeine Java-Themen 12
S public void actionPerformed Allgemeine Java-Themen 5
D Kein public Konstruktor Allgemeine Java-Themen 4
G private vs. public JRE Allgemeine Java-Themen 3
N this im public static void Allgemeine Java-Themen 3
C public boolean containsAll(Collection c) Allgemeine Java-Themen 2
C Theorie Duplicate default methods Allgemeine Java-Themen 5
L Eclipse Editieren des Code templates für Override methods Allgemeine Java-Themen 2
M Wo hin mit static factory methods? Allgemeine Java-Themen 40

Ähnliche Java Themen


Oben