Java

Aus Claudio's Wiki
Wechseln zu: Navigation, Suche

Operatoren

freehep


IF THEN ELSE

Abkürzung für if-then-else: ?:

boolean-expression ? op1 : op2 ;

Bedeutet:
IF boolean-expression = true THEN op1 ELSE op2;

Wichtig: Diese Operation gibt ein Wert zurück! Also entweder op1 oder op2, je nach dem, ob die boolean-expression true oder false ist! Also:

newOp = boolean-expression ? op1 : op2 ;

Bedeutet:
IF boolean-expression = true THEN newOp = op1 ELSE newOp = op2;

Schleifen

break und continue

In for-, while- und do-while-Schleifen können break und continue eingesetzt werden:

break
Der Schleifendurchlauf wird beendet und die Abarbeitung bei der ersten Anweisung nach der Schleife fortgeführt.
continue
Geht zum Schleifenkopf zurück. Nach dem Auswerten des Fortschaltausdrucks wird im nächsten Schritt erneut geprüft, ob die Schleife weiter durchlaufen werden soll.

Collections

Uebersicht

Eine Uebersicht über konkrete Container-Klassen findest du auf Galileocomputing JavaInsel 8 Kapitel 12.1.6.


Sorting

Zum sortieren muss ein Objekt Comparable sein. Wenn das aber nicht geht (z.B. wenn man ein und dasselbe Objekt auf verschiedene arten sortiert werden soll (ein Telefonbuch nach Nachname, Vorname, Ort, ...)), dann muss das anders gelöst werden.
Ein Beispiel:

/**
 * UserSorter
 *
 * <p>
 * Sort strategy to sort the User by field <code>name.
 * </p>
 *
 * @author mic
 *
 */
public class UserSorter
{
    public List<User> sort(List<User> list)
    {
        // get comparator
        Comparator<User> comparator = new NameComparator();

        // sort list with configured comparator
        Collections.sort(list, comparator);

        return list;
    }
}

/**
 * NameComparator
 *
 * <p>
 * Compare User field name.
 * </p>
 *
 * @author mic
 */
class NameComparator implements Comparator<User>
{
    public int compare(User o1, User o2)
    {
        String s1 = o1.getName();
        String s2 = o2.getName();
        
        // both are null
        if(s1 == null && s2 == null)
        {
            return 0;
        }

        // either of them is null
        if(s1 == null)
        {
            return -1;
        }
        if(s2 == null)
        {
            return 1;
        }

        // compare strings
        return s1.compareToIgnoreCase(s2);
    }
}

Diverses

Java-VM-Args (kann z.B. in eclipse benutzt werden [eclipse.ini oder beim Starten von eclipse])


Performance

Um zu sehen, wie die vm ausgelastet ist und memory braucht, kann man

VisualVM
Muss installiert werden, braucht in der Verison 1.2.2 mind. jdk6
jconsole
Ist bestandteil der jdk (im bin Verzeichnis)

benutzen.

Die jvm braucht diese Option, damit es funktioniert:

#enabling jconsole
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"

HeapDump

HeapDump sind nützlich, wenn eine Java-App OutOfMemory Errors hat.

Um einen Heapdump auf dem Server zu ziehen gibt es zwei Möglichkeiten:

  1. Wenn die Java VM mit der Option -XX:+HeapDumpOnOutOfMemoryError gestartet wird, generiert sie einen Heapdump bevor sie sich verabschiedet.
    Mit der Option -XX:HeapDumpPath=/jvm/dump sagt man der VM, in welchem Verzeichnis sie den Dump speichern soll.
  2. Ab Java 6 enhält das JDK das Tool jmap, welches gebraucht werden kann, um einen HeapDump "on the fly" zu generiern, Du musst nur die PID des JVM Prozesses kennen.


fan@wsdis:~$ jps -l 3665 org.jboss.Main 3703 sun.tools.jps.Jps

--> JBoss hat die PID 3665 (ps könnte man natürlich auch verwenden, um die PID zu ermitteln.)

fan@wsdis:~$ jmap -dump:file=/home/fan/jboss-$(date +%H:%M:%S).hprof 3665 Dumping heap to /home/fan/jboss-13:32:11.hprof ... Heap dump file created fan@wsdis:~$

JavaDoc

Servlet Container Config

web.xml

Web.xml ist die Konfigurationsdatei für den Servlet-Container.

Element
load-on-startup (optional)
Wert
Ganzzahl
Beschreibung
Definiert, dass das zugehörige Servlet beim Starten der Servers mit gestartet wird. Die Ganzzahl gibt die Reihenfolge an. Wenn <0, dann ist die Reihenfolge egal. Ab Servlet-Schema 2.4 darf load-on-startup nicht leer sein (<load-on-startup/>).
Beispiel
<load-on-startup>0</load-on-startup>

web.xml full details

web.xml: Deployment Descriptor

  • web-app: Deployment Descriptor für die Webanwendung (root Element)
    • icon: Icon für die Anzeige der Webanwendung in einem Entwicklungstool
      • small-icon: 16x16 Pixel große GIF- oder JPG- Datei
      • large-icon: 32x32 Pixel große GIF- oder JPG- Datei
    • display-name: Name der Webanwendung
    • description: Optionale Beschreibung der Webanwendung
    • distributable: Gibt an, ob die Webanwendung so programmiert wurde, dass sie in einem verteilten Servlet-Container ausgeführt werden kann
    • context-param: Zur Angabe von Startparametern für die Webanwendung. Können in der Webanwendung mit GetInitParameter und GetInitParameterNames abgefragt werden.
      • param-name: Name des Parameters
      • param-value: Wert des Parameters
      • description: Beschreibung des Parameters
    • filter: Filterkonfiguration
      • icon: Icon für die Anzeige des Filters in einem Entwicklungstool
        • small-icon: 16x16 Pixel große GIF- oder JPG- Datei
        • large-icon: 32x32 Pixel große GIF- oder JPG- Datei
      • filter-name: Name, unter dem das Filter an einer anderen Stelle im Deployment-Descriptor referenziert werden kann
      • display-name: Name, unter dem das Filter in einem Entwicklungstool angezeigt wird.
      • description: Beschreibung des Filters
      • filter-class: Klassenname des Filters
      • init-param: Initialisierungsparameter für das Filter
        • param-name: Name des Parameters
        • param-value: Wert des Parameters
        • description: Beschreibung des Parameters
    • filter-mapping: Filter-Abbildungen
      • filter-name: Entspricht dem filter-name aus dem Abschnitt filter
      • url-pattern: Wird das url-pattern in der Request-URL gefunden, so wird der Filter auf den Request angewandt
      • servlet: Name des Servlets, an das der Filter den Request weiterleitet
    • listener: Listener-Konfiguration
      • listener-class: Name einer Klasse, deren Methoden bei bestimmten Events vom Servlet-Container aufgerufen werden.
    • servlet: Servlet-Einstellungen
      • icon: Icon für die Anzeige des Servlets in einem Entwicklungstool
        • small-icon: 16x16 Pixel große GIF- oder JPG- Datei
        • large-icon: 32x32 Pixel große GIF- oder JPG- Datei
      • servlet-name: Name, unter dem das Servlet an einer anderen Stelle im Deployment-Descriptor referenziert werden kann
      • display-name: Name, unter dem das Servlet in einem Entwicklungstool angezeigt wird.
      • description: Beschreibung des Servlets
      • servlet-class: Klassenname des Servlets
      • jsp-file: Anstelle eines Servlets (servlet-class) kann auch eine JSP-Datei angegeben werden
      • init-param: Initialisierungsparameter für das Servlet
        • param-name: Name des Parameters
        • param-value: Wert des Parameters
        • description: Beschreibung des Parameters
      • load-on-startup: Bestimmt die Reihenfolge, in der die Servlets vom Applikationsserver geladen werden. Positive, ganze Zahl, 1 wird zuerst geladen
      • security-role-ref: Ermöglicht die Abbildung einer fest kodierten Sicherheitsrolle auf eine benutzerdefinierte Roll.
    • servlet-mapping: Bestimmt, welches Servlet bei einer URL aufgerufen wird
      • servlet-name: Entspricht dem servlet-name aus dem Abschnitt servlet
      • url-pattern: Wird das url-pattern in der Request-URL gefunden, so wird das zugeordnete Servlet aufgerufen
    • mime-mapping: Verknüpft Dateierweiterungen mit MIME-Typen
      • extension: Dateinamenserweiterung, z.B. txt
      • mime-type: Mime-Typ, z.B. text/plain
    • session-config: Session-Einstellungen
      • session-timeout: Anzahl Minuten, nach denen die Session ungültig wird. Bei -1 läuft die Session nie ab.
    • welcome-file-list: Liste mit Dateien, von denen die erste existierende angezeigt wird, falls der Benutzer im Browser nur das Context-Rootverzeichnis als URL angibt
      • welcome-file: Name einer Datei, die Standardmäßig angezeigt werden soll, z.B. index.htm
    • error-page: Definiert die Abbildung zwischen einem Fehlercode oder einem Exception-Typ und der URL einer Fehlerseite, die beim Auftreten des Fehlers angezeigt werden soll
      • exception-type: Voll qualifizierter Klassenname einer Java-Exception
      • error-code: HTTP Fehlercode, z.B. 404
      • location: URL der Fehlerseite
    • taglib: Zur Konfiguration von Taglibs
      • taglib-uri: URI, die zum Einbinden der Taglib in einer JSP-Seite verwendet wird
      • taglib-location: Pfad zur TLD-Datei relativ zum Context-Root der Webanwendung
    • resource-ref: Ermöglicht es, externe Resourcen unter einem virtuellen Namen anzusprechen
      • description: Beschreibung der Resource
      • res-ref-name: Name der Resource im JNDI-Baum
      • res-type: Java-Typ der Resource mit Package-Name
      • res-auth: Bei APPLICATION ist die Anwendung für die Authorisierung zuständig, bei CONTAINER erledigt dies der Applikationsserver
    • security-constraint: Zur Definition von Zugriffsbeschränkungen
      • web-resource-collection: Komponenten der Webanwendung, auf die der Zugriff beschränkt werden soll
        • web-resource-name: Name der Resourcenliste
        • url-pattern: URL-Muster der Komponenten, die zu der Resourcenliste gehören
      • auth-constraint: Benutzer mit den angegebenen Rollen haben Zugriff auf die Resourcen
        • description: Beschreibung der Zugriffsbeschränkung
        • role-name: Rollen, die Zugriff auf die Resourcen haben
    • login-config: Legt fest, wie die Benutzerauthentifizierung erfolgen soll
      • auth-method: Authentifizierungsmethode BASIC - Authentifizierung durch den Browser FORM - Authentifizierung über ein Webformular CLIENT-CERT
      • realm-name: Bereichsname
    • security-role: Definition von Sicherheitsrollen
      • description: Beschreibung der Sicherheitsrolle
      • role-name: Name der Sicherheitsrolle
    • env-entry: Zur Definition von Umgebungsvariablen
      • description: Beschreibung der Umgebungsvariablen
      • env-entry-name: Name der Umgebungsvariablen
      • env-entry-type: Java-Typ der Umgebungsvariablen, java.lang.Boolean, String, Integer, Double, Float
      • env-entry-value: Wert der Umgebungsvariablen
    • ejb-ref: Referenz auf eine EJB-Resource
      • ejb-ref-name: Name der EJB-Referenz, der in der Webanwendung benutzt wird
      • ejb-ref-type: Java-Typ der referenzierten Enterprise Java Bean
      • home: Voll qualifizierter Klassenname des EJB-Home-Interfaces
      • remote: Voll qualifizierter Klassenname des EJB-Remote-Interfaces

JSP

Interessante Links



Interfaces

Interfaces sind im Grunde genommen abstrakte Klassen, wo ALLE Methoden abstrakt sind. Das heisst, dass eine Implementierung davon auch alle Methoden implementieren muss.
Auch Konstanten und Objekte (inkl. Instanzierung) können in Interfaces geschrieben werden. Beispiel:

public interface MyConstants
{
   /** Constant 1 */ 
   public static final String CTX_RUNTIME = "RUNTIME";
   
   /** Constant 2 */
   public static final String INDIV_ITEM = "INDIV_ITEM";

   /** Objects */
   // Auch neue Objekte sind möglich
   public static final Map<String, String> myMap = new HashMap<String, String>(10);
   ...
}

Naming

Gängige Benennungen der Klassen und deren Bedeutung

Factory
Fabrik
Wrapper
Wandler

Modifikatoren (modifier)

  • The static modifier for creating class methods and variables
  • The final modifier for finalizing the implementations of classes, methods, and variables.
  • The abstract modifier for creating abstract classes and methods.
  • The synchronized and volatile modifiers, which are used for threads.

Zugriffsmodifikatoren (access modifier)

keyword EN DE
public Visible to the world Öffentlich: Für alle sichtbar
protected Visible to the package and all subclasses Geschützt: Wie Paketsichtbar, aber zusätzlich alle erbenden Klassen.
(none) Visible to the package, the default. No modifiers are needed. Paketsichtbar: Nur Typen im gleichen Paket sehen die paketsichtbaren Eigenschaften.
private Visible to the class only Privat: Nur in derselben Klasse sichtbar.


Eigenschaft ist Sieht eigene Klasse Sieht Klasse
im gleichen Paket
Sieht Unterklasse
im anderen Paket
Sieht Klasse
in anderem Paket
public ja ja ja ja
protected ja ja ja nein
paketsichtbar ja ja nein nein
private ja nein nein nein

Reihenfolge

Modifier:
  Annotation | public | protected | private
  static | abstract | final | native | synchronized
  transient | volatile | strictfp

ClassOrInterfaceDeclaration:
        {Modifier} (ClassDeclaration | InterfaceDeclaration)

MethodOrFieldDecl:
        {Modifier} Type Identifier MethodOrFieldRest

Code quality

Cyclomatic complexity

Damit bezeichnet man die komplexität des Quellcodes/Methode basierend auf die möglichen Abzweigungen im logischen Fluss.
Gemessen wird das so:

Die Methode startet mit dem Wert 1
+1 für jeden return ausser dem Letzten
+1 für jeden if, else, case, default
+1 für jeden for, while, do-while, break, continue
+1 für jeden Operator: &&, ||, ?, :
+1 für jede exception catch, finally, throw, throws
Auswertung
Werte bis und mit 4: Komplexität ist gut
Werte von 5 bis 10: Komplexität noch akzeptabel
Werte über 10: Code zu komplex