Java类:我需要向类添加一个String类型的新字段。我应该扩展(创建一个新的派生类)还是简单地添加新字段?

Java类:我需要向类添加一个String类型的新字段。我应该扩展(创建一个新的派生类)还是简单地添加新字段?,java,class,oop,object-oriented-analysis,Java,Class,Oop,Object Oriented Analysis,我正试图了解有关这方面的最佳实践。我有一个带有一些字段的类。现在我需要添加一个String类型的新字段 该类的大多数实例不需要这个新的字符串字段,因此不会为这些实例设置它。某些实例将设置此字段 那么,我是否应该创建一个新的子类,并创建属于该子类的后一个实例?请说明原因。您的问题的答案取决于许多因素(系统是否处于生产状态,系统的复杂程度等),因此答案不止一个 但是,当我阅读你的问题时,我提到了一个似乎是常见错误的问题“该类的大多数实例不需要这个新的字符串字段” 请记住,此语句是一种代码味道。因为你

我正试图了解有关这方面的最佳实践。我有一个带有一些字段的类。现在我需要添加一个String类型的新字段

该类的大多数实例不需要这个新的字符串字段,因此不会为这些实例设置它。某些实例将设置此字段


那么,我是否应该创建一个新的子类,并创建属于该子类的后一个实例?请说明原因。

您的问题的答案取决于许多因素(系统是否处于生产状态,系统的复杂程度等),因此答案不止一个

但是,当我阅读你的问题时,我提到了一个似乎是常见错误的问题“该类的大多数实例不需要这个新的字符串字段”


请记住,此语句是一种代码味道。因为你为不需要的对象“添加”了额外的知识。对这个类进行更多的抽象是解决这个问题的唯一方法

您的问题的答案取决于许多因素(系统是否处于生产状态,系统的复杂程度等),因此答案不止一个

但是,当我阅读你的问题时,我提到了一个似乎是常见错误的问题“该类的大多数实例不需要这个新的字符串字段”


请记住,此语句是一种代码味道。因为你为不需要的对象“添加”了额外的知识。对这个类进行更多的抽象是解决这个问题的唯一方法

案例:您希望将
字符串颜色
添加到
汽车
,但它在许多用途中都不会被使用

我不会在这里创建子类,但要添加:

Optional<String> color = Optional.empty();
Optional color=Optional.empty();
原因是:

  • (正式)它是一个has-a关系,而不是一个is-a关系
  • 它不会改变现有部分中的业务逻辑
  • 它的影响最小

因为我不喜欢
null
上初始化
,或者使用
可选的

案例:您想要将
字符串颜色
添加到
汽车
,但它在很多情况下都不会被使用

我不会在这里创建子类,但要添加:

Optional<String> color = Optional.empty();
Optional color=Optional.empty();
原因是:

  • (正式)它是一个has-a关系,而不是一个is-a关系
  • 它不会改变现有部分中的业务逻辑
  • 它的影响最小

由于我不喜欢
null
上初始化,或者使用
可选的

谁需要访问这个新字段,是否存在访问限制,是否存在行为差异,因为成员和/或其影响类的操作,这些是决定是否需要子类或添加新成员的关键问题。如果您添加了一个具体的示例(代码),解释您尝试执行的操作,这将是非常有用的。假设我有一个类Car,它使用字符串字段model和yearmanufacted。现在我想添加一个新的字符串字段颜色。某些情况下不会设置此新字段。请使用具体示例,而不是“假设我们有一辆车”-这没有任何意义,因为每辆车都有颜色,可能与您的原始问题相去甚远。谁需要访问此新字段,是否存在访问限制,是否因为成员和/或其影响类的操作而存在行为差异,这些是决定您是否需要子类或添加新成员的一些关键问题如果您添加了一个具体示例(代码),解释您尝试执行的操作,这将非常有用。假设我有一辆类车,它以前有字符串字段模型和日期。现在我想添加一个新的字符串字段颜色。有些情况下不会设置此新字段。请使用一个具体的示例,而不是“假设我们有一辆车”-这没有任何意义,因为每辆车都有一种颜色,可能与您最初的问题相去甚远。