Java Class:我需要向 class 添加一个字符串类型的新字段。我应该扩展(创建一个新的派生 class)还是简单地添加新字段?
Java Class: I need to add a new field of type String to a class. Should I extend (create a new derived class) or simply add the new field?
我想了解这方面的最佳实践。我有一个包含某些字段的 class。现在我需要添加一个 String 类型的新字段。
class 的大多数实例不需要这个新的字符串字段,因此不会为这些实例设置它。某些实例将设置此字段。
那么我应该创建一个新的 subclass 并将后面的实例创建为这个 subclass 吗?请说明原因。
您的问题的答案取决于很多因素(系统是否处于生产状态、系统的复杂程度等),因此没有唯一的答案。
但是当我阅读你的问题时,我提到了一些似乎是常见错误的东西 "Most of the instances of that class don't need this new String field".
请记住,此语句是一种代码味道。因为您 "add" 对不需要的对象有额外的了解。对此 class 进行更多抽象是解决此问题的唯一方法。
案例:您想将 String color
添加到 Car
,但它不会用于许多用法。
我不会在这里创建子类,但添加:
Optional<String> color = Optional.empty();
原因:
- (正式)是has-a关系,不是is-a。
- 它将不改变现有部分的业务逻辑。
- 影响最小。
因为我不喜欢 null
要么在 ""
上初始化,要么使用 Optional
。
我想了解这方面的最佳实践。我有一个包含某些字段的 class。现在我需要添加一个 String 类型的新字段。
class 的大多数实例不需要这个新的字符串字段,因此不会为这些实例设置它。某些实例将设置此字段。
那么我应该创建一个新的 subclass 并将后面的实例创建为这个 subclass 吗?请说明原因。
您的问题的答案取决于很多因素(系统是否处于生产状态、系统的复杂程度等),因此没有唯一的答案。
但是当我阅读你的问题时,我提到了一些似乎是常见错误的东西 "Most of the instances of that class don't need this new String field".
请记住,此语句是一种代码味道。因为您 "add" 对不需要的对象有额外的了解。对此 class 进行更多抽象是解决此问题的唯一方法。
案例:您想将 String color
添加到 Car
,但它不会用于许多用法。
我不会在这里创建子类,但添加:
Optional<String> color = Optional.empty();
原因:
- (正式)是has-a关系,不是is-a。
- 它将不改变现有部分的业务逻辑。
- 影响最小。
因为我不喜欢 null
要么在 ""
上初始化,要么使用 Optional
。