Java:程序开发中if else多层嵌套的优化

您所在的位置:网站首页 java判断怎么写好一点 Java:程序开发中if else多层嵌套的优化

Java:程序开发中if else多层嵌套的优化

2024-07-09 11:43| 来源: 网络整理| 查看: 265

Java:程序开发中if else多层嵌套的优化

if else作为每种编程语言都不可或缺的条件语句,我们在编程时会大量的用到。但if else一般不建议嵌套超过三层,如果一段代码存在过多的if else嵌套,代码的可读性就会急速下降,后期维护难度也大大提高。所以,程序员都应该尽量避免过多的if else嵌套。下面将会简单谈谈如何减少if else的嵌套。

业务场景:分享一条新闻的标题,内容,链接。 业务基础类:如下

private static final int TYPE_TITLE = 0; private static final int TYPE_CONTENT = 1; private static final int TYPE_LINK = 2; public class NewItem { int type; String title; String content; String link; } public interface ShareNewListener { int STATE_SUCC = 0; int STATE_FAIL = 1; void onCallback(int state, String message); }

业务实现:如下

public void share (NewItem item, ShareNewListener listener) { if (item != null) { if (item.type == TYPE_LINK) { // 分享链接 if (item.link != null) { doShareLink(item.link, item.content, listener); } else { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "分享信息不完整"); } } } else if (item.type == TYPE_TITLE ) { // 分享标题 if (item.title != null)) { doShareText(item.title, listener); } else { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "分享信息不完整"); } } } else if (item.type == TYPE_CONTENT) { // 分享内容 if (item.content != null) { doShareImageAndText(item.content, listener); } else { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "分享信息不完整"); } } } else { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "不支持的分享类型"); } } } else { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "NewItem 不能为 null"); } } }

if else嵌套一般是为了解决空值判断,业务判断,状态判断等问题。针对这些问题可以通过下述方法进行优化:

方法一:接口分层

所谓接口分层指的是:把接口分为外部和内部接口,所有空值判断放在外部接口完成,只处理一次;而内部接口传入的变量由外部接口保证不为空,从而减少空值判断。

public void share(NewItem item, ShareNewListener listener) { if (item == null) { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "ShareItem 不能为 null"); } return; } if (listener == null) { return; } shareImpl(item, listener); } private void shareImpl(ShareItem item, ShareNewListener listener) { if (item.type == TYPE_LINK) { // 分享链接 if (item.link != null) { doShareLink(item.link, item.content, listener); } else { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "分享信息不完整"); } } } else if (item.type == TYPE_TITLE ) { // 分享标题 if (item.title != null)) { doShareText(item.title, listener); } else { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "分享信息不完整"); } } } else if (item.type == TYPE_CONTENT) { // 分享内容 if (item.content != null) { doShareImageAndText(item.content, listener); } else { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "分享信息不完整"); } } } else { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "不支持的分享类型"); } } }

方法二:多态

利用多态,每种业务单独处理,在接口不再做任何业务判断。

private static final int TYPE_TITLE = 0; private static final int TYPE_CONTENT = 1; private static final int TYPE_LINK = 2; public abstract class NewItem { int type; String title; String content; String link; public NewItem(int type,String title,String content,String link) { this.type = type; this.title=title; this.content=content; this.link=link; } public abstract void doShare(ShareNewListener listener); } public class New_Title extends NewItem { String title; public Link(String title) { super(TYPE_TITLE); this.title = title!=null ? title : "default"; } @Override public void doShare(ShareNewListener listener) { listener.onCallback(ShareNewListener.STATE_SUCC, title); } } public class New_Content extends NewItem { String content; public Link(String content) { super(TYPE_CONTENT); this.content = content!=null ? content : "default"; } @Override public void doShare(ShareNewListener listener) { listener.onCallback(ShareNewListener.STATE_SUCC, content); } } public class New_Link extends NewItem { String link; public Link(String link) { super(TYPE_LINK); this.link = link!=null ? link : "default"; } @Override public void doShare(ShareNewListener listener) { listener.onCallback(ShareNewListener.STATE_SUCC, link); } } public void share(NewItem item, ShareNewListener listener) { if (item == null) { if (listener != null) { listener.onCallback(ShareNewListener.STATE_FAIL, "ShareItem 不能为 null"); } return; } if (listener == null) { return; } shareImpl(item, listener); } private void shareImpl(NewItem item, ShareNewListener listener) { item.doShare(listener); } public ShareItem createNew_TitleItem(String title) { return new New_Title(title); } public ShareItem createNew_ContentItem(String content) { return new New_Content(content); } public ShareItem createNew_LinkItem(String link) { return new New_LinkItem(link); }

方法三:使用Map替代分支语句

把所有分享子类型预先缓存在Map里,那么就可以直接get获取具体类型,消除分支

private Map


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3