gpt4 book ai didi

java - 根据条件创建不同的 POJO 子对象,但共享公共(public)字段

转载 作者:行者123 更新时间:2023-11-30 02:15:11 24 4
gpt4 key购买 nike

我正在实现一个日志管理系统,并且希望日志的类型是可扩展的。我们得到一个从 JSON(来自 Filebeat)解析的基础对象,例如:

class LogLine {
String message
Date timestamp
String type
String source
}

给定这个 LogLine 对象,我希望能够创建不同的对象,这也将扩展这个 LogLine。

class SomeLog extends LogLine {
int myfield
String username
}

class SomeOtherLog extends LogLine {
Date startTime
Date endTime
String username
String transactionID
}

所以,在我当前的非理想实现中:

void parse(String s){
LogLine logLine = .....parseFromString(s)
if ( logline.type.equals('def') ){
SomeLog someLog = new SomeLog.Builder.build(logLine)
} else if ( logline.message.containts('abc') ){
SomeOtherLog someotherLog = new SomeOtherLog.Builder.build(logline)
}
}

但是,正如您可以想象的那样,子类中的构建器会复制父类(super class) LogLine 对象,我是否可以在不复制值的情况下做到这一点,因为它们已经是子类了?有没有一种设计模式可以实现这一点?我不想依赖像 BeanUtils.copyProperperties 这样的反射

最佳答案

当您基于另一个对象创建新对象时,最好复制所有字段。这是一个名为 defensive copying 的最佳实践。 。

由于您解析字符串,因此不需要防御性副本。另外,我想您会想要从输入字符串中解析一些特定字段,例如 SomeLogmyfieldSomeOtherLogstartDate >。您可以像

那样重构对象创建
LogLine result = null;
if (s.contains('type=def') {
result = SomeLog.parse(s);
} else if (trickyRegexp.mathces(s)) {
result = SomeOtherLog.parse(s);
} else {
result = LogLine.parse(s);
}

如果您有许多 LogLine 子类,那么您可能希望将创建逻辑移至 LogFactory,它管理有关将字符串解析为特定对象的所有内容。

关于java - 根据条件创建不同的 POJO 子对象,但共享公共(public)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48781329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com