Thema der Woche: Das XML-Modell XOM

XOM (http://www.xom.nu/tutorial.xhtml) ist ein XML-Modell von Elliotte Rusty Harold, welches eine Alternative zu DOM, aber auch zu moderneren XML-Modellen JDOM und dom4j ist.

Um die Philosophie hinter dem Design zu verstehen, hat Elliotte Rusty Harold mit Bill Venners auf artima ein Interview geführt.

Aufgabe: Gehe mit XOM und XPath an das XML-Ergebnis einer REST-Abfrage http://www.flickr.com/services/api/flickr.places.findByLatLon.html und gib nur die place_url aus.

http://acs.lbl.gov/nux/ lässt sich als Erweiterung von XOM verstehen. Was macht NUX genau?

Labels:

Inselupdate: enum mit eigenen Konstruktoren und Methoden

Da eine enum-Klasse mit der Klassendeklaration verwandt ist, kann sie ebenso Attribute und Metho-den deklarieren. Geben wir einer Aufzählung Country eine Methode, die den ISO 3166-2 Landescode des jeweiligen Aufzählungselements liefert:

public enum Country
{
  GERMANY, UK, CHINA;

  public String getISO3Country()
  {
    if ( this == GERMANY )
      return Locale.GERMANY.getISO3Country();
    else if ( this == UK )
      return Locale.UK.getISO3Country();
    return Locale.CHINA.getISO3Country();
  }
}   

Die Methode getISO3Country() kann nun auf den Enum-Objekten aufgerufen werden.

System.out.println( Country.CHINA.getISO3Country() ); // CHN
Da switch auf enum erlaubt ist, können wir schreiben:

Country c = Country.GERMANY;

switch ( c )
{
  case GERMANY:
    System.out.println( "Aha. Ein Krauti" );         // Aha. Ein Krauti
    System.out.println( meinLand.getISO3Country() ); // DEU
    break;
  default:      System.out.println( "Anderes Land" );
}

Enum mit Konstruktoren

Neben dieser Variante wollen wir eine zweite Implementierung nutzen, und nun Konstruktoren hinzu-ziehen, um das gleiche Problem auf andere Weise zu lösen:

public enum Country
{
  GERMANY( Locale.GERMANY ), UK( Locale.UK ), CHINA( Locale.CHINA );

  private Locale country;

  private Country( Locale country )
  {
    this.country = country;
  }

  public String getISO3Country()
  {
    return country.getISO3Country();
  }
}

Bei der Deklaration der Konstanten wird in runden Klammern ein Argument für den Konstruktor übergeben. Der Konstruktor speichert das zugehörige Locale-Objekt in der internen Variable country, auf die dann getISO3Country() Bezug nimmt.

Enum mit überschriebenen Methoden   

In dem Enum-Typen lassen sich nicht nur Methoden hinzufügen, sondern auch Methoden überschrei-ben. Beginnen wir mit einer lokalisierten und überladenen Methode toString().

public enum WeekdayInternational
{
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;

  @Override
  public String toString()
  {
    return new SimpleDateFormat().getDateFormatSymbols().getWeekdays()[ ordinal() + 1 ]; 
  }

  public String toString( Locale l )
  {
    return new SimpleDateFormat("", l).getDateFormatSymbols().getWeekdays()[ ordinal() + 1 ]; 
  }
}

Die erste Methode ist aus unserer Oberklasse Object überschrieben, die zweite als überladene Funk-tion hinzugefügt. Ein Beispiel macht den Aufruf und die Funktionsweise klar:

System.out.println( WeekdayInternational.SATURDAY );                         // Samstag
System.out.println( WeekdayInternational.SATURDAY.toString() );              // Samstag
System.out.println( WeekdayInternational.SATURDAY.toString(Locale.FRANCE) ); // samedi
System.out.println( WeekdayInternational.SATURDAY.toString(Locale.ITALY) );  // sabato

An dieser Stelle hören die Möglichkeiten der Enum-Syntax aber noch nicht auf. Ähnlich wie die Syn-tax von inneren anonymen Klassen, die es erlauben, Methoden zu überschreiben, bieten Aufzählungs-typen eine ähnliche Syntax, um gezielt Methoden für eine spezielle Konstante zu überschreiben.

Nehmen wir an, in einem Spiel gibt es eine eigene Währung, denn Ponro Dollar. Nun soll dieser aber mit einer Referenzwährung, dem Euro, in Beziehung gesetzt werden: Der Wechselkurs ist einfach 1:2.

public enum GameCurrency
{
  EURO() {
    @Override double convertTo( GameCurrency targetCurrency, double value )
    {
      return targetCurrency == EURO ? value : value / 2;
    }
  },
  PONRODOLLAR() {
    @Override double convertTo( GameCurrency targetCurrency, double value )
    {
      return targetCurrency == PONRODOLLAR ? value : value * 2;
    }
  }; 
  abstract double convertTo( GameCurrency targetCurrency, double value );
}

Der interessante Teil ist die Deklaration der abstrakten convertTo() Methode und der Implementie-rung lokal bei den einzelnen Konstanten. (Natürlich müssen wir nicht jede Methoden im Enum abs-trakt machen, sondern sie kann auch konkret sein. Dann muss nicht jedes Enum-Element die abstrakte Methode implementieren.)

Mit einem statischen Import für die Aufzählung lässt sich die Nutzung und Funktionalität schnell zeigen:

System.out.println( EURO.convertTo( EURO, 12 ) );               // 12.0
System.out.println( EURO.convertTo( PONRODOLLAR, 12 ) );        // 6.0
System.out.println( PONRODOLLAR.convertTo( EURO, 12 ) );        // 24.0
System.out.println( PONRODOLLAR.convertTo( PONRODOLLAR, 12 ) ); // 12.0

Labels:

Jersey 1.0 (JAX-RS) ist fertig

Im Sun-Blog ist http://blogs.sun.com/theaquarium/entry/jersey_1_0_just_shipped ist zu lesen:

JAX-RS co-spec lead and Jersey lead Paul Sandoz just announced Jersey 1.0 availability. v1.0 moments are always special and this one is certainly no exception given how progress was made on a regular basis from engineering hard work and lots of community feedback. Congrats to Paul and the entire community for a well run open source project !

Jersey 1.0 is obviously a JAX-RS 1.0 implementation, but it also adds Spring integration, a REST client, and obviously is production quality...
One of the signs of a community-involved project is the many ways the bits can be accessed: GlassFish v2 and v3, NetBeans 6.5, Maven 2, zip, etc...

With Jersey 1.0 out the door, you can now freely choose your Web Services style and stick to standards. Java EE 6, scheduled sometime mid-2009, will make this even clearer though a maintenance release.
See Jersey for more stories.

Labels:

Thema der Woche: Sun Certified Java Programmer (SCJP)

The Sun Certified Java Programmer (SCJP) exam is the entry level Java exam and is a prerequisite to a number of the other Java-related certifications. SCJP 6, designated CX-310-065 by Sun, was released in December 2007. It is designed to have a fairly detailed test of basic knowledge of the essentials of the Java programming language. It tests looping constructs and variables, and does not cover specific technologies such as GUI creation, Web or network programming. It is assessed through an automatically administered multiple-choice test system and consists of 72 questions which the candidate has 210 minutes to answer. At least 47 questions are needed to be correct to pass (around 65%). The SCJP 5 exam tests a candidate on knowledge of declarations, access control, object orientation, assignments, operators, flow control, assertions, string handling, I/O, parsing, formatting, generics, collections, inner classes, threads and the JDK toos (Quelle: http://en.wikipedia.org/wiki/Sun_Certified_Professional).

Zur Vorbereitung auf den SCJP gibt es im Netz viele Fragen, die denen aus dem SCJP sehr ähnlich sind. Auch wer kein SCJP machen möchte, sollte sich mit dem Thema beschäftigen, da es doch das tiefe Verständnis der Sprache Java schärft (weniger den Bibliotheken oder dem Design von großen Anwendungen!)

Labels:

TWAIN-Scannen mit Java

http://www.mms-computing.co.uk/uk/co/mmscomputing/device/twain/ ist eine Java-API für die TWAIN-Schnittstelle, um etwa einen Scanner anzusteuern. Ein Beispiel ist schnell aufgebaut:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;

import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXImagePanel;
import org.jdesktop.swingx.JXImagePanel.Style;

import uk.co.mmscomputing.device.scanner.Scanner;
import uk.co.mmscomputing.device.scanner.ScannerIOException;
import uk.co.mmscomputing.device.scanner.ScannerIOMetadata;
import uk.co.mmscomputing.device.scanner.ScannerListener;
public class TwainExample
{
  @SuppressWarnings("serial")
  public static void main( String[] args )
  {
    final JXImagePanel imagePanel = new JXImagePanel();
    imagePanel.setStyle( Style.SCALED_KEEP_ASPECT_RATIO );
    final Scanner scanner = Scanner.getDevice();
    JXFrame f = new JXFrame( "SSP", true );
    Action action = new AbstractAction("Scan") {
      @Override public void actionPerformed( ActionEvent e ) {
        try { scanner.acquire(); } catch ( ScannerIOException ex ) { }
      }
    };
    f.add( new JButton(action), BorderLayout.PAGE_START );
    f.add( imagePanel );
    f.setSize( 1000, 700 );
    f.setVisible( true );
    scanner.addListener( new ScannerListener()
    {
      public void update( ScannerIOMetadata.Type type, ScannerIOMetadata metadata )
      {
        if ( ScannerIOMetadata.ACQUIRED.equals( type ) )
          imagePanel.setImage( metadata.getImage() );
      }
    } );
  }
}

Labels:

Konvertierung Bildschirm-Pixel in cm

Folgende Formel gibt eine Annäherung

int pixel = 1111;

String cm = Math.round(pixel/(Toolkit.getDefaultToolkit().getScreenResolution()/2.54)) + " cm";

Globale Tastendrücke und Mausoperationen abfangen (Windows)

Globale Mausbewegungen von Java zu überwachen ist mit dem MouseInfo.getPointerInfo().getLocation() kein Problem. Aber mitzubekommen, ob in einer anderen Java-Applikation eine Maustaste oder eine andere Keyboard-Taste gedrückt ist, schon. Wer vor dem Problem steht, dies unter Java und Windows abzufangen, kann SWT zusammen mit den SWT Win32 Extensions (http://www.swtui.cn/index.php) nutzen -- auch wenn man selbst nicht mit SWT, sondern mit Swing arbeitet. Soll etwa global die <Pause> Taste abgefangen werden, kann man schreiben:

Hook.KEYBOARD.addListener(new HookEventListener() {
    public void acceptHookData( HookData hookData ) {
      if ( ((KeyboardHookData) hookData).getVirtualKeyCode() == KeyEvent.VK_PAUSE &&
          ! ((KeyboardHookData) hookData).getTransitionState() ) {
         // TU WAS DICH GLÜCKLICH MACHT
      }
} } );
Hook.KEYBOARD.install();

Neben Hook.KEYBOARD gibt es auch Hook.MOUSE.

Möchte man nun beides zusammen haben, also wissen, ob etwa STRG und eine Maustaste gedrückt wurde, meldet man einen HookEventListener für die Maus an und fragt die Taste wie folgt ab:

Extension.GetKeyState(Extension.VK_CONTROL) < 0

Labels:

Heise schreibt: "Bedarf an Java-Experten legt weiter rasant zu"

http://www.heise.de/newsticker/Bedarf-an-Java-Experten-legt-weiter-rasant-zu--/meldung/116871

Ob man bei der Aussage "Die Ausschreibungen im Bereich Java haben seit Jahresbeginn stark zugenommen und im August erstmals das Niveau der entsprechenden Projektangebote für SAP-Experten erreicht" dies auf Stärke von Java zurückführen kann, oder einfach nur auf die gesunkene Anfrage von SAP sei einmal dahingestellt.

Dass es einen "Aufschwung hat auch die Nachfrage nach Spezialisten für C++" gibt, haben wir bei tutego tatsächlich gemerkt, da vermehrt Anfragen nach C++ und insbesondere der Boost-Bibliothek zu verzeichnen ist.


Suche

Willkommen!

In diesem Blog schreibe ich über aktuelle Entwicklungen in Java, Softwareentwicklung im Allgemeinen, Open-Source, JavaScript, neue Eclipse-Plugins und Neuerungen im Buch ›Java ist auch eine Insel‹.

Mein Foto
Name: Christian Ullenboom
Standort: Hannover, Niedersachsen, Germany

Ich bin Christian Ullenboom und Autor des Buches ›Java ist auch eine Insel‹. Seit 1997 schule ich als Java-Tutor Themen wie Java SE, EJB 3, Hibernate, JSP/Servlets. Sun ernannte mich 2005 zum ›Java-Champion‹.

Feed hinzufügen

  • AddThis Feed Button


XML