Make Priority an enum

Today we have an abstraction Priority for representing
priorities. Ideally, these values are a fixed set of constants with a
well-defined ordering which sounds perfect for an enum. This commit
changes Priority so that it is an enum instead of a class.
This commit is contained in:
Jason Tedor 2016-07-15 08:47:38 -04:00
parent ac39e73183
commit 220a510d65
3 changed files with 19 additions and 94 deletions

View File

@ -16,28 +16,29 @@
* specific language governing permissions and limitations * specific language governing permissions and limitations
* under the License. * under the License.
*/ */
package org.elasticsearch.common; package org.elasticsearch.common;
import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.StreamOutput;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/** public enum Priority {
*
*/ IMMEDIATE((byte) -1),
public final class Priority implements Comparable<Priority> { URGENT((byte) 0),
HIGH((byte) 1),
NORMAL((byte) 2),
LOW((byte) 3),
LANGUID((byte) 4);
public static Priority readFrom(StreamInput input) throws IOException { public static Priority readFrom(StreamInput input) throws IOException {
return fromByte(input.readByte()); return fromByte(input.readByte());
} }
public static void writeTo(Priority priority, StreamOutput output) throws IOException { public static void writeTo(Priority priority, StreamOutput output) throws IOException {
byte b = priority.value; output.writeByte(priority.value);
output.writeByte(b);
} }
public static Priority fromByte(byte b) { public static Priority fromByte(byte b) {
@ -53,90 +54,18 @@ public final class Priority implements Comparable<Priority> {
} }
} }
public static final Priority IMMEDIATE = new Priority((byte) -1);
public static final Priority URGENT = new Priority((byte) 0);
public static final Priority HIGH = new Priority((byte) 1);
public static final Priority NORMAL = new Priority((byte) 2);
public static final Priority LOW = new Priority((byte) 3);
public static final Priority LANGUID = new Priority((byte) 4);
private static final List<Priority> VALUES =
Collections.unmodifiableList(Arrays.asList(IMMEDIATE, URGENT, HIGH, NORMAL, LOW, LANGUID));
private final byte value; private final byte value;
private Priority(byte value) { Priority(byte value) {
this.value = value; this.value = value;
} }
/**
* All priorities, sorted from highest priority to lowest priority. The returned list is
* unmodifiable.
*
* @return an unmodifiable list of priorities, sorted from highest priority to lowest priority.
*/
public static List<Priority> values() {
return VALUES;
}
@Override
public int compareTo(Priority p) {
return (this.value < p.value) ? -1 : ((this.value > p.value) ? 1 : 0);
}
public boolean after(Priority p) { public boolean after(Priority p) {
return value > p.value; return this.compareTo(p) > 0;
} }
public boolean sameOrAfter(Priority p) { public boolean sameOrAfter(Priority p) {
return value >= p.value; return this.compareTo(p) >= 0;
} }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Priority.class != o.getClass()) return false;
Priority priority = (Priority) o;
if (value != priority.value) return false;
return true;
}
@Override
public int hashCode() {
return (int) value;
}
@Override
public String toString() {
switch (value) {
case (byte) -1: return "IMMEDIATE";
case (byte) 0: return "URGENT";
case (byte) 1: return "HIGH";
case (byte) 2: return "NORMAL";
case (byte) 3: return "LOW";
default:
return "LANGUID";
}
}
public static Priority valueOf(String value) {
switch (value) {
case "IMMEDIATE":
return IMMEDIATE;
case "URGENT":
return URGENT;
case "HIGH":
return HIGH;
case "NORMAL":
return NORMAL;
case "LOW":
return LOW;
case "LANGUID":
return LANGUID;
default:
throw new IllegalArgumentException("no such priority: " + value);
}
}
} }

View File

@ -22,7 +22,6 @@ import org.elasticsearch.common.io.stream.BytesStreamOutput;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -37,7 +36,7 @@ public class PriorityTests extends ESTestCase {
IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> { IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> {
Priority.valueOf("foobar"); Priority.valueOf("foobar");
}); });
assertEquals("no such priority: foobar", exception.getMessage()); assertEquals("No enum constant org.elasticsearch.common.Priority.foobar", exception.getMessage());
} }
public void testToString() { public void testToString() {
@ -47,7 +46,7 @@ public class PriorityTests extends ESTestCase {
assertEquals("LOW", Priority.LOW.toString()); assertEquals("LOW", Priority.LOW.toString());
assertEquals("URGENT", Priority.URGENT.toString()); assertEquals("URGENT", Priority.URGENT.toString());
assertEquals("NORMAL", Priority.NORMAL.toString()); assertEquals("NORMAL", Priority.NORMAL.toString());
assertEquals(6, Priority.values().size()); assertEquals(6, Priority.values().length);
} }
public void testSerialization() throws IOException { public void testSerialization() throws IOException {
@ -63,7 +62,7 @@ public class PriorityTests extends ESTestCase {
assertSame(Priority.LOW, Priority.fromByte((byte) 3)); assertSame(Priority.LOW, Priority.fromByte((byte) 3));
assertSame(Priority.NORMAL, Priority.fromByte((byte) 2)); assertSame(Priority.NORMAL, Priority.fromByte((byte) 2));
assertSame(Priority.URGENT,Priority.fromByte((byte) 0)); assertSame(Priority.URGENT,Priority.fromByte((byte) 0));
assertEquals(6, Priority.values().size()); assertEquals(6, Priority.values().length);
} }
public void testCompareTo() { public void testCompareTo() {
@ -82,11 +81,11 @@ public class PriorityTests extends ESTestCase {
for (Priority p : Priority.values()) { for (Priority p : Priority.values()) {
assertEquals(0, p.compareTo(p)); assertEquals(0, p.compareTo(p));
} }
List<Priority> shuffeledAndSorted = new ArrayList<>(Priority.values()); List<Priority> shuffeledAndSorted = Arrays.asList(Priority.values());
Collections.shuffle(shuffeledAndSorted, random()); Collections.shuffle(shuffeledAndSorted, random());
Collections.sort(shuffeledAndSorted); Collections.sort(shuffeledAndSorted);
for (List<Priority> priorities : Arrays.asList(shuffeledAndSorted, for (List<Priority> priorities : Arrays.asList(shuffeledAndSorted,
Priority.values())) { // #values() guarantees order! Arrays.asList(Priority.values()))) { // #values() guarantees order!
assertSame(Priority.IMMEDIATE, priorities.get(0)); assertSame(Priority.IMMEDIATE, priorities.get(0));
assertSame(Priority.URGENT, priorities.get(1)); assertSame(Priority.URGENT, priorities.get(1));
assertSame(Priority.HIGH, priorities.get(2)); assertSame(Priority.HIGH, priorities.get(2));

View File

@ -41,16 +41,13 @@ import java.util.concurrent.atomic.AtomicBoolean;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
/**
*
*/
public class PrioritizedExecutorsTests extends ESTestCase { public class PrioritizedExecutorsTests extends ESTestCase {
private final ThreadContext holder = new ThreadContext(Settings.EMPTY); private final ThreadContext holder = new ThreadContext(Settings.EMPTY);
public void testPriorityQueue() throws Exception { public void testPriorityQueue() throws Exception {
PriorityBlockingQueue<Priority> queue = new PriorityBlockingQueue<>(); PriorityBlockingQueue<Priority> queue = new PriorityBlockingQueue<>();
List<Priority> priorities = new ArrayList<>(Priority.values()); List<Priority> priorities = Arrays.asList(Priority.values());
Collections.shuffle(priorities, random()); Collections.shuffle(priorities, random());
for (Priority priority : priorities) { for (Priority priority : priorities) {