Java 确保施工前或施工时对象的有效性

Java 确保施工前或施工时对象的有效性,java,oop,Java,Oop,我正在给一辆有颜色的汽车做模型。 我想确定颜色是否有效。因此,我在Car类中创建了一个嵌套枚举,它将保存有效的颜色。我想了解这个想法: 人们应该如何创造汽车? 公开枚举。在构造函数中,需要一个枚举值。这确保了有效的颜色。 枚举是我的!我的类的用户不需要知道它!我会让他给我一个字符串,我会为任何枚举值解析它。如果无效,我将抛出一个异常 我更倾向于揭露真相。有什么理由我不想这样做吗?例如,创建汽车实例可能会让用户过于复杂?虽然我猜他更喜欢这个而不是运行时异常 你说呢?考虑一下工厂模式。您可以在那里隐

我正在给一辆有颜色的汽车做模型。 我想确定颜色是否有效。因此,我在Car类中创建了一个嵌套枚举,它将保存有效的颜色。我想了解这个想法:

人们应该如何创造汽车? 公开枚举。在构造函数中,需要一个枚举值。这确保了有效的颜色。 枚举是我的!我的类的用户不需要知道它!我会让他给我一个字符串,我会为任何枚举值解析它。如果无效,我将抛出一个异常 我更倾向于揭露真相。有什么理由我不想这样做吗?例如,创建汽车实例可能会让用户过于复杂?虽然我猜他更喜欢这个而不是运行时异常


你说呢?

考虑一下工厂模式。您可以在那里隐藏所有的检查和颜色处理代码,并且您的汽车可以保持现在的状态,使用颜色作为枚举参数。工厂没有构造函数的限制,您可以随意为方法命名,例如:

public class CarFactory{
   public static Car createRedCar() { return new Car(Color.RED);  }
   public static Car createBlueCar(){ return new Car(Color.BLUE); }
}

工厂解决方案很好,很优雅,但每次需要添加新颜色时,都会强制添加新方法。如果你想增加轮子的数量,那么你就有麻烦了,因为你会把工厂方法的数量增加一倍。我会坚持使用曝光解决方案。它非常容易理解,为您添加新颜色提供了一定的灵活性。这就像在枚举类中添加一行一样简单,而且非常符合Java的风格。你知道,Java非常冗长!但这只是一种观点。

我认为在这种情况下,公开枚举不是问题。关于有效值,使用字符串的方法不是很安全。使用枚举显式定义哪些值有效。毕竟,枚举就是为了这个目的而存在的-

你还应该考虑使用Car类。如果需要在另一个上下文中获取汽车的颜色,还需要返回枚举而不是字符串,这意味着您必须将其公开


如果您认为工厂模式不适用于您的情况,但是如果不知道您的car类所使用的整个上下文,就很难说。

您认为如何将enum实现为一个独立的类?它目前只是汽车的一项功能,但也可能被其他车型使用。而且这样的颜色也不太像汽车……我看不出我问的问题与是否使用工厂的决定之间的关系。但我会用这个来引出另一个问题:我不会像你建议的那样有一大堆方法吗?对于汽车的每种颜色,我需要一个方法,然后对于汽车车轮数的任何其他属性,例如给我:createRedCarWith4Wheels,createRedCarWith6Wheels。我预计你会告诉我使用生成器模式。但我仍然不明白构建器将如何从我这里接收参数。如果你愿意,也许你可以和我分享?工厂对象只是一个助手。您仍然可以使用具有颜色或车轮数量等参数的构造函数创建新车。关键是,汽车的创造是从汽车本身分离到一个地方的。如果你有更多的参数,车轮数量,发动机类型,。。。比抽象工厂更合适。工厂的参数如何与汽车的构造结合完全取决于你。我完全同意,这是我来这里之前的偏见。但Uwe Allner说得有道理,他说:你们需要汽车的颜色吗?但你也有一辆摩托车,它的有效颜色是其他颜色。您和我同意的解决方案将创建2个颜色枚举。他建议对这两种情况使用更通用的1枚举。我不知道什么更好。有人知道在这种情况下什么更好吗?谢谢你的输入JavierV。如果要求规定汽车和摩托车需要不同的有效颜色,您将如何处理这种情况?在其各自的类或常规枚举中创建2个枚举?好问题。。。两个枚举将是快速和详细的,但您可以选择实现一个通用枚举和一个颜色过滤器ColorValidator enum color。这样,您可以使用所有颜色的通用枚举,并在不同的验证器中为每个类指定限制。验证器将作为汽车/摩托车类的静态部分实现,并让您决定摩托车接受哪些颜色,汽车接受哪些颜色