Java 枚举中的业务逻辑?
在enum中放置任何类型的业务逻辑是否被认为是良好的实践?不是真正的强烈逻辑,但更像是方便实用的方法。例如:Java 枚举中的业务逻辑?,java,enums,business-logic,Java,Enums,Business Logic,在enum中放置任何类型的业务逻辑是否被认为是良好的实践?不是真正的强烈逻辑,但更像是方便实用的方法。例如: public enum OrderStatus { OPEN, OPEN_WITH_RESTRICTIONS, OPEN_TEMPORARY, CLOSED; public static boolean isOpenStatus(OrderStatus sts) { return sts == OPEN || sts == OPEN_WITH_RESTRICTION
public enum OrderStatus {
OPEN, OPEN_WITH_RESTRICTIONS, OPEN_TEMPORARY, CLOSED;
public static boolean isOpenStatus(OrderStatus sts) {
return sts == OPEN || sts == OPEN_WITH_RESTRICTIONS || sts == OPEN_TEMPORARY;
}
}
嗯,这使您能够将相关信息放在可能被使用和搜索的地方。枚举没有理由不是具有实际责任的实际类
如果这允许您编写更简单的代码,为什么不呢?因为您的示例中的逻辑与枚举值(名称)紧密相连,我想不出更好的位置来放置它。我经常对单例实例使用枚举。因此,它们几乎只包含业务逻辑。作为简单扩展
Enum
的类,它们甚至可以实现接口
我只考虑使用Enums,如果它符合枚举值,即Buiess逻辑与实例紧密耦合。
< P>枚举主要任务是执行一组特定的具有程序员友好名称的值。如果可以将业务逻辑表示为一组静态值,那么枚举是一种很好的方法。不要忘记,在Java中,您可以创建包含超过个的枚举类,如果您有一组相关的值,那么这些类将非常有用。是的,我认为这是一个好主意。但是,我认为可以使用实例方法更干净地实现它:public enum OrderStatus {
OPEN, OPEN_WITH_RESTRICTIONS, OPEN_TEMPORARY,
CLOSED {
@Override isOpen() { return false; }
};
public boolean isOpen()
{
return true;
}
}
对于上面的简单业务逻辑,这是可以的,但是当扩展枚举时,我遇到了一个问题,这是不可能的。例如,我们在枚举中存储了额外的数据,后来希望获得许多不同枚举的值的反向映射,这对于标准类来说很容易,但是对于枚举(没有代码重复)来说是不可能的。
标准类也可以做同样的事情(除了在switch语句中使用),并且更加灵活和可靠。如果枚举可能会得到更复杂的逻辑,那么最好使用类,否则在我看来,使用带有简单逻辑的枚举是很好的现在,只要我们能在C#land中这样做:(“枚举没有理由不是实际负责的实际类。”:在Java中,枚举是实际的类;)@Brian-我是这么说的,应该这样对待它们(与C的枚举相反),我希望这就是答案。我以前听说过枚举应该只充当常量,本质上是哑对象。sts不是吗!=CLOSED可能更简单。+1对于使用枚举编写单例,应该有更多的人使用该方法。@Tom Hawtin一般来说,单例没有错。它们可以而且使用得不好,但这并不意味着它是一种糟糕的设计模式。单例可以像其他任何东西一样被滥用,但如果使用正确,它们肯定是有用的。甚至Josh Bloch也建议为此使用Enum,b/c这样您就不必担心手动滚动单例类的序列化和其他经常遗漏的细节