public enum Direction {
NORTH, EAST, SOUTH, WEST
}
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
public enum Operation {
ADD {
public double Apply(double x, double y) { return x + y; }
},
SUBTRACT {
public double apply(double x, double y) { return x - y; }
};
public abstract double apply(double x, double y);
}
public enum Pl.NET {
MERCURY (3.303e+23, 2.4397e6),
// other planets...
private final double mass; // in kilograms
private final double radius; // in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
// Getter methods
}
Direction dir = Direction.EAST;
switch (dir) {
case NORTH:
System.out.println("Going north");
break;
// other cases...
}
public interface Printable {
void print();
}
public enum Color implements Printable {
RED, GREEN, BLUE;
@Override
public void print() {
System.out.println(this.name());
}
}
类型安全:枚举确保值是枚举类型的实例,防止传递无效常量时发生错误。
命名空间:枚举常量有自己的命名空间,避免与其他常量发生冲突。
方法和字段:枚举可以具有字段和方法,提供比静态常量更多的功能。
表示固定的常量集:例如一周中的几天、方向、流程状态等。
单例模式:由于枚举本质上是单例,因此它们可用于实现单例行为。
策略模式实现:枚举可以实现接口定义的不同策略。
public class Vehicle {
private String make;
private String model;
private int year;
public Vehicle(String make, String model, int year) {
this.make = make;
this.model = model;
this.year = year;
}
// Getters and setters for each field
}
Vehicle myCar = new Vehicle("Honda", "Civic", 2020);
public void displayInfo() {
System.out.println(make + " " + model + " (" + year + ")");
}
public int calculateAge(int currentYear) {
return currentYear - year;
}
public class ElectricVehicle extends Vehicle {
private int batteryCapacity;
public ElectricVehicle(String make, String model, int year, int batteryCapacity) {
super(make, model, year);
this.batteryCapacity = batteryCapacity;
}
// Additional methods specific to electric vehicles
}
不变性:在可能的情况下,使您的自定义数据类型不可变。不可变对象更易于理解和使用,并且更健壮,特别是在多线程环境中。
验证:始终验证和清理构造函数和设置器中的输入,以确保对象的状态一致且有效。
DRY 原则:不要重复自己。将公共代码分解到方法或父类中以避免重复。
public enum CarType {
SEDAN, SUV, HATCHBACK, CONVERTIBLE
}
public class Car {
private String make;
private String model;
private CarType type;
public Car(String make, String model, CarType type) {
this.make = make;
this.model = model;
this.type = type;
}
// Getters and setters
}
public enum EngineType {
DIESEL {
@Override
public void start() {
System.out.println("Starting diesel engine...");
}
},
ELECTRIC {
@Override
public void start() {
System.out.println("Starting electric engine...");
}
};
public abstract void start();
}
public class Car {
private EngineType engineType;
public Car(EngineType engineType) {
this.engineType = engineType;
}
public void startCar() {
engineType.start();
}
}
public enum CarState {
PARKED, DRIVING, IDLE
}
public class Car {
private CarState state;
public Car() {
this.state = CarState.PARKED;
}
public void changeState(CarState newState) {
this.state = newState;
}
// Additional methods
}
类型安全:枚举提供了一种方法来确保仅使用有效值,从而减少错误并简化调试。
可读性:使用枚举使代码更具可读性,因为值被明确定义和命名。
维护:如果需要更新可能的值集(例如,添加新的汽车类型),则更改集中在枚举定义中。
一致的命名约定:对枚举和自定义数据类型使用清晰一致的命名约定,以增强代码的可读性和可维护性。
固定常量集的枚举用法:利用枚举来表示相关常量的固定集(如方向、状态、模式)。这种方法确保类型安全和代码清晰度。
不可变的自定义数据类型:尽可能将自定义数据类型设计为不可变的。不可变对象更容易推理、线程安全,并且可以防止与可变性相关的许多潜在问题。
利用枚举方法:利用向枚举添加方法的能力。此功能可以极大地增强其功能并允许更复杂的行为。
自定义数据类型中的封装:将字段封装在自定义数据类型中,并通过 getter 和 setter(或其他方法)公开它们。这种做法可确保对象状态的完整性并遵守面向对象编程的原则。
Java 集合的有效使用:在集合中使用枚举和自定义数据类型时,请确保了解不同集合类型(如ArrayList、HashSet等)的特征,并选择最适合您需求的一种。
测试枚举和自定义数据类型功能:严格测试枚举和自定义数据类型的行为和集成。单元测试对于验证每个组件的功能特别有效。
过度使用枚举:避免对非固定或动态值集使用枚举。枚举最适合固定常量,将它们误用于动态值可能会导致代码臃肿且难以维护。
忽略空安全:使用枚举和自定义数据类型时,请考虑空值的可能性。实施空值检查或使用 Java 的可选类等功能来优雅地处理潜在的空值。
枚举中的复杂构造函数:在枚举中使用复杂构造函数时要小心。虽然枚举可以有构造函数,但使它们过于复杂会降低可读性并引入错误。
滥用自定义数据类型的继承:继承可能很强大,但如果使用不当,也可能导致紧密耦合和脆弱的代码。在适用的情况下,优先考虑组合而不是继承。
忽略重写toString方法:对于自定义数据类型,重写toString方法可以提供更具信息性和可读性的输出,尤其是在调试期间。
过多的可变性:自定义数据类型的过多可变性可能会导致难以跟踪的错误和问题,尤其是在并发上下文中。尽可能减少可变性。
缺乏文档:枚举和自定义数据类型都可能变得复杂,因此必须维护清晰的文档,解释每种类型的目的和用法。