Java解析论坛API JSON时类中某变量有时未使用的面向对象最佳处理方案
嘿,作为常年和Java对象、JSON解析打交道的开发者,我刚好处理过不少类似的API字段缺失场景,给你几个面向对象视角下的最优处理方案,都是实际项目里跑通的:
这是最直接也最常用的方式,毕竟评论数是可选返回的属性,完全符合Optional的设计初衷。你可以把评论数字段定义为Optional<Integer>,这样既明确了它的可选性,又避免了空指针问题。
举个代码例子:
public class ForumDiscussion { private String id; private String title; private String content; private String author; private Optional<Integer> commentCount; // 标记为可选属性 // 构造器、getter/setter // 额外提供一个返回默认值的方法,简化使用 public int getCommentCountOrDefault() { return commentCount.orElse(0); // 无返回时默认评论数为0 } }
在解析JSON的时候(比如用Jackson这类库),如果API没返回commentCount字段,框架会自动把它设为Optional.empty()。后续使用时,你可以通过isPresent()判断是否有值,或者直接用orElse()取默认值,非常安全省心。
如果不同搜索类型对应的讨论对象差异比较明显(不只是缺个评论数),用继承拆分基础属性和扩展属性会更清晰。先定义包含所有必选属性的父类,再针对有评论数的场景定义子类:
// 基础讨论类:包含所有必选属性 public class BaseForumDiscussion { protected String id; protected String title; protected String content; protected String author; // 构造器、getter/setter } // 带评论数的讨论类:继承基础类,添加可选属性 public class DiscussionWithCommentCount extends BaseForumDiscussion { private int commentCount; // 构造器、getter/setter }
解析时根据搜索类型选择对应的类反序列化,不同类型的对象职责更明确,完全符合面向对象的单一职责原则。比如普通搜索用BaseForumDiscussion,特定搜索用子类即可。
如果后续可能还有更多可选属性需要添加,建造者模式的灵活性会非常突出。你可以在建造者里给可选属性设置默认值,或者允许调用者选择性赋值:
public class ForumDiscussion { private String id; private String title; private String content; private String author; private int commentCount; // 默认值为0 private ForumDiscussion(Builder builder) { this.id = builder.id; this.title = builder.title; this.content = builder.content; this.author = builder.author; this.commentCount = builder.commentCount; } public static class Builder { private String id; private String title; private String content; private String author; private int commentCount = 0; // 可选属性默认值 // 必选属性的链式setter public Builder id(String id) { this.id = id; return this; } public Builder title(String title) { this.title = title; return this; } // ... 其他必选属性的setter // 可选属性的链式setter public Builder commentCount(int commentCount) { this.commentCount = commentCount; return this; } public ForumDiscussion build() { // 这里可以添加必选属性的非空校验 return new ForumDiscussion(this); } } }
解析JSON时,把存在的字段传给建造者,不存在的就用默认值,对象构建过程可控,后续扩展新的可选属性也非常方便。
总结一下
如果只是单个可选属性,方案1最省心;如果不同搜索类型的对象差异较大,方案2更贴合面向对象设计;如果后续属性可能频繁变动,方案3的扩展性最好。你可以根据自己的项目场景选最合适的~
内容的提问来源于stack exchange,提问作者Hoof-Hearted

