通用代码的 superclass 与 utility class
superclass vs utility class for common code
我在 2 classes 中使用相同的方法将字段从一个对象复制到构建器。我想重构它,但我不知道是否应该在实用程序 class 中创建静态方法或将其抽象为超级 class.
共享此代码的 classes 是 Bean 和多线程应用程序的一部分。
方法如下:
protected static void copyPartyGroup(Message.Builder msgBuilder,
final PartyGroup partyIDsGroup, Party.Builder rartyBuilder) {
rartyBuilder.setPartyID(partyIDsGroup.getId())
....
msgBuilder.setID(partyIDsGroup.getId())
....
}
非常感谢您的帮助。
你也可以使用trait in java 8,它是一个带有默认方法的接口
参见:https://opencredo.com/traits-java-8-default-methods/
或:https://dzone.com/articles/using-traits-in-java-8
如果你的两个 class 不共享同一个父结构,不要使用超级抽象 class,如果创建这个超级 class 的唯一原因是共享你的方法 copyPartyGroup
不是一个好的做法。
参见:Liskov 替换原则
如果您想遵守单一职责原则:
我认为您必须创建一个服务 class。
在你的例子中,可能是一个线程安全的单例,带有 rartyBuilder.setPartyID
和 msgBuilder.setID
的同步方法。 (参见 Initialization-on-demand holder idiom)
如果你可以提取静态方法,那么最好直接这样做。
使用继承来共享代码会耦合您的代码,并使以后很难理清。
我在 2 classes 中使用相同的方法将字段从一个对象复制到构建器。我想重构它,但我不知道是否应该在实用程序 class 中创建静态方法或将其抽象为超级 class.
共享此代码的 classes 是 Bean 和多线程应用程序的一部分。
方法如下:
protected static void copyPartyGroup(Message.Builder msgBuilder,
final PartyGroup partyIDsGroup, Party.Builder rartyBuilder) {
rartyBuilder.setPartyID(partyIDsGroup.getId())
....
msgBuilder.setID(partyIDsGroup.getId())
....
}
非常感谢您的帮助。
你也可以使用trait in java 8,它是一个带有默认方法的接口
参见:https://opencredo.com/traits-java-8-default-methods/
或:https://dzone.com/articles/using-traits-in-java-8
如果你的两个 class 不共享同一个父结构,不要使用超级抽象 class,如果创建这个超级 class 的唯一原因是共享你的方法 copyPartyGroup
不是一个好的做法。
参见:Liskov 替换原则
如果您想遵守单一职责原则:
我认为您必须创建一个服务 class。
在你的例子中,可能是一个线程安全的单例,带有 rartyBuilder.setPartyID
和 msgBuilder.setID
的同步方法。 (参见 Initialization-on-demand holder idiom)
如果你可以提取静态方法,那么最好直接这样做。
使用继承来共享代码会耦合您的代码,并使以后很难理清。