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 - 2007 db4objects Inc. http://www.db4o.com */ 02 03package com.db4odoc.enums; 04 05public enum Qualification { 06 07 WINNER("WINNER"), 08 PROFESSIONAL("PROFESSIONAL"), 09 TRAINEE("TRAINEE"); 10 11 private String qualification; 12 13 private Qualification(String qualification) { 14 this.qualification = qualification; 15 } 16 17 public void testChange(String qualification){ 18 this.qualification = qualification; 19 } 20 21 public String toString() { 22 return qualification; 23 } 24}

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

EnumExample.java: setPilots
01private static void setPilots(){ 02 new File(DB4O_FILE_NAME).delete(); 03 ObjectContainer container=Db4o.openFile(DB4O_FILE_NAME); 04 try { 05 container.set(new Pilot("Michael Schumacher",Qualification.WINNER)); 06 container.set(new Pilot("Rubens Barrichello",Qualification.PROFESSIONAL)); 07 } finally { 08 container.close(); 09 } 10 }
EnumExample.java: checkPilots
01private static void checkPilots(){ 02 ObjectContainer container=Db4o.openFile(DB4O_FILE_NAME); 03 try { 04 ObjectSet result = container.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 container.close(); 18 } 19 }

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

EnumExample.java: deletePilots
01private static void deletePilots(){ 02 System.out.println("Qualification enum before delete Pilots"); 03 printQualification(); 04 Configuration configuration = Db4o.newConfiguration(); 05 configuration .objectClass(Pilot.class).objectField("qualification").cascadeOnDelete(true); 06 ObjectContainer container=Db4o.openFile(configuration, DB4O_FILE_NAME); 07 08 try { 09 ObjectSet result = container.query(Pilot.class); 10 for(int x = 0; x < result.size(); x++){ 11 Pilot pilot = (Pilot )result.get(x); 12 container.delete(pilot); 13 } 14 } finally { 15 container.close(); 16 } 17 System.out.println("Qualification enum after delete Pilots"); 18 printQualification(); 19 }
EnumExample.java: checkPilots
01private static void checkPilots(){ 02 ObjectContainer container=Db4o.openFile(DB4O_FILE_NAME); 03 try { 04 ObjectSet result = container.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 container.close(); 18 } 19 }

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

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

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
01private static void updateQualification(){ 02 System.out.println("Updating WINNER qualification constant"); 03 ObjectContainer container=Db4o.openFile(DB4O_FILE_NAME); 04 try { 05 Query query = container.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 container.set(qualification); 13 } 14 } finally { 15 container.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.