Java enumerations

This topic applies to Java version only

Enumerated types were brought into Java with the JDK 1.5 release. In fact they represent a class with static fields similar to the one reviewed in the Static fields paragraph.

Qualification.java
01/* Copyright (C) 2004 - 2006 db4objects Inc. http://www.db4o.com */ 02 03package com.db4odoc.f1.enums; 04 05 06public enum Qualification { 07 08 WINNER("WINNER"), 09 PROFESSIONAL("PROFESSIONAL"), 10 TRAINEE("TRAINEE"); 11 12 private String qualification; 13 14 private Qualification(String qualification) { 15 this.qualification = qualification; 16 } 17 18 public void testChange(String qualification){ 19 this.qualification = qualification; 20 } 21 22 public String toString() { 23 return qualification; 24 } 25}

db4o takes care about storing enumeration objects automatically without any additional settings:

EnumExample.java: setPilots
01public static void setPilots(){ 02 new File(Util.YAPFILENAME).delete(); 03 ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 04 try { 05 db.set(new Pilot("Michael Schumacher",Qualification.WINNER)); 06 db.set(new Pilot("Rubens Barrichello",Qualification.PROFESSIONAL)); 07 } finally { 08 db.close(); 09 } 10 }
EnumExample.java: checkPilots
01public static void checkPilots(){ 02 ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 03 try { 04 ObjectSet result = db.query(Pilot.class); 05 System.out.println("Saved pilots: " + result.size()); 06 for(int x = 0; x < result.size(); x++){ 07 Pilot pilot = (Pilot )result.get(x); 08 if (pilot.getQualification() == Qualification.WINNER){ 09 System.out.println("Winner pilot: " + pilot); 10 } else if (pilot.getQualification() == Qualification.PROFESSIONAL){ 11 System.out.println("Professional pilot: " + pilot); 12 } else { 13 System.out.println("Uncategorized pilot: " + pilot); 14 } 15 } 16 } finally { 17 db.close(); 18 } 19 }

Another specific feature of enums in db4o: deletion is not possible:

EnumExample.java: deletePilots
01public static void deletePilots(){ 02 System.out.println("Qualification enum before delete Pilots"); 03 printQualification(); 04 ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 05 db.ext().configure() .objectClass(Pilot.class).objectField("qualification").cascadeOnDelete(true); 06 07 try { 08 ObjectSet result = db.query(Pilot.class); 09 for(int x = 0; x < result.size(); x++){ 10 Pilot pilot = (Pilot )result.get(x); 11 db.delete(pilot); 12 } 13 } finally { 14 db.close(); 15 } 16 System.out.println("Qualification enum after delete Pilots"); 17 printQualification(); 18 }
EnumExample.java: checkPilots
01public static void checkPilots(){ 02 ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 03 try { 04 ObjectSet result = db.query(Pilot.class); 05 System.out.println("Saved pilots: " + result.size()); 06 for(int x = 0; x < result.size(); x++){ 07 Pilot pilot = (Pilot )result.get(x); 08 if (pilot.getQualification() == Qualification.WINNER){ 09 System.out.println("Winner pilot: " + pilot); 10 } else if (pilot.getQualification() == Qualification.PROFESSIONAL){ 11 System.out.println("Professional pilot: " + pilot); 12 } else { 13 System.out.println("Uncategorized pilot: " + pilot); 14 } 15 } 16 } finally { 17 db.close(); 18 } 19 }

Deletion of references does not automatically delete the enum. Even explicit deletion does not work:

EnumExample.java: deleteQualification
01public static void deleteQualification(){ 02 System.out.println("Explicit delete of Qualification enum"); 03 ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 04 db.ext().configure() .objectClass(Qualification.class).cascadeOnDelete(true); 05 try { 06 ObjectSet result = db.query(Qualification.class); 07 for(int x = 0; x < result.size(); x++){ 08 Qualification pq = (Qualification)result.get(x); 09 db.delete(pq); 10 } 11 } finally { 12 db.close(); 13 } 14 printQualification(); 15 }

Enum update works in the same way as for normal static objects - updated enum should be explicitly saved to database (#set(enum)).

EnumExample.java: updateQualification
01public static void updateQualification(){ 02 System.out.println("Updating WINNER qualification constant"); 03 ObjectContainer db=Db4o.openFile(Util.YAPFILENAME); 04 try { 05 Query query = db.query(); 06 query.constrain(Qualification.class); 07 query.descend("qualification").constrain("WINNER"); 08 ObjectSet result = query.execute(); 09 for(int x = 0; x < result.size(); x++){ 10 Qualification qualification = (Qualification)result.get(x); 11 qualification.testChange("WINNER2006"); 12 db.set(qualification); 13 } 14 } finally { 15 db.close(); 16 } 17 printQualification(); 18 }

You can use either build-in Java enums or write your own. Db4o will take care of keeping object references unique and database file as small as possible.