Note that there are some explanatory texts on larger screens.

plurals
  1. POImplementing a bitfield using java enums
    primarykey
    data
    text
    <p>I maintain a large document archive and I often use bit fields to record the status of my documents during processing or when validating them. My legacy code simply uses static int constants such as:</p> <pre><code>static int DOCUMENT_STATUS_NO_STATE = 0 static int DOCUMENT_STATUS_OK = 1 static int DOCUMENT_STATUS_NO_TIF_FILE = 2 static int DOCUMENT_STATUS_NO_PDF_FILE = 4 </code></pre> <p>This makes it pretty easy to indicate the state a document is in, by setting the appropriate flags. For example: </p> <pre><code>status = DOCUMENT_STATUS_NO_TIF_FILE | DOCUMENT_STATUS_NO_PDF_FILE; </code></pre> <p>Since the approach of using static constants is bad practice and because I would like to improve the code, I was looking to use Enums to achieve the same. There are a few requirements, one of them being the need to save the status into a database as a numeric type. So there is a need to transform the enumeration constants to a numeric value. Below is my first approach and I wonder if this is the correct way to go about this? </p> <pre><code>class DocumentStatus{ public enum StatusFlag { DOCUMENT_STATUS_NOT_DEFINED(1&lt;&lt;0), DOCUMENT_STATUS_OK(1&lt;&lt;1), DOCUMENT_STATUS_MISSING_TID_DIR(1&lt;&lt;2), DOCUMENT_STATUS_MISSING_TIF_FILE(1&lt;&lt;3), DOCUMENT_STATUS_MISSING_PDF_FILE(1&lt;&lt;4), DOCUMENT_STATUS_MISSING_OCR_FILE(1&lt;&lt;5), DOCUMENT_STATUS_PAGE_COUNT_TIF(1&lt;&lt;6), DOCUMENT_STATUS_PAGE_COUNT_PDF(1&lt;&lt;7), DOCUMENT_STATUS_UNAVAILABLE(1&lt;&lt;8); private final long statusFlagValue; StatusFlag(long statusFlagValue) { this.statusFlagValue = statusFlagValue; } public long getStatusFlagValue(){ return statusFlagValue; } } /** * Translates a numeric status code into a Set of StatusFlag enums * @param numeric statusValue * @return EnumSet representing a documents status */ public EnumSet&lt;StatusFlag&gt; getStatusFlags(long statusValue) { EnumSet statusFlags = EnumSet.noneOf(StatusFlag.class); StatusFlag.each { statusFlag -&gt; long flagValue = statusFlag.statusFlagValue if ( (flagValue&amp;statusValue ) == flagValue ) { statusFlags.add(statusFlag); } } return statusFlags; } /** * Translates a set of StatusFlag enums into a numeric status code * @param Set if statusFlags * @return numeric representation of the document status */ public long getStatusValue(Set&lt;StatusFlag&gt; flags) { long value=0; flags.each { statusFlag -&gt; value|=statusFlag.getStatusFlagValue() } return value; } public static void main(String[] args) { DocumentStatus ds = new DocumentStatus(); Set statusFlags = EnumSet.of( StatusFlag.DOCUMENT_STATUS_OK, StatusFlag.DOCUMENT_STATUS_UNAVAILABLE); assert ds.getStatusValue( statusFlags )==258 // 0000.0001|0000.0010 long numericStatusCode = 56; statusFlags = ds.getStatusFlags(numericStatusCode); assert !statusFlags.contains(StatusFlag.DOCUMENT_STATUS_OK); assert statusFlags.contains(StatusFlag.DOCUMENT_STATUS_MISSING_TIF_FILE); assert statusFlags.contains(StatusFlag.DOCUMENT_STATUS_MISSING_PDF_FILE); assert statusFlags.contains(StatusFlag.DOCUMENT_STATUS_MISSING_OCR_FILE); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload