当前位置: 首页 > news >正文

Java 代码规范if嵌套

在Java编程中,过度的if嵌套会使代码难以阅读和维护。为了遵循良好的代码规范,我们应尽量减少嵌套的深度。这通常可以通过重新组织代码或使用其他结构(如switch语句,或者将逻辑封装到单独的方法中)来实现。

以下是一个减少if嵌套的示例。

示例:用户身份验证和权限检查

假设我们有一个系统,需要对用户进行身份验证,并根据用户的角色赋予不同的权限。

不规范的做法(深层嵌套):

public class AccessControl {  public static void checkAccess(User user) {  if (user != null) {  if (user.isAuthenticated()) {  if (user.getRole().equals("admin")) {  System.out.println("Admin access granted.");  } else if (user.getRole().equals("user")) {  System.out.println("User access granted.");  } else {  System.out.println("Access denied.");  }  } else {  System.out.println("User is not authenticated.");  }  } else {  System.out.println("User is null.");  }  }  
}

规范的做法(减少嵌套):

public class AccessControl {  public static void checkAccess(User user) {  if (user == null) {  System.out.println("User is null.");  return;  }  if (!user.isAuthenticated()) {  System.out.println("User is not authenticated.");  return;  }  grantAccessBasedOnRole(user);  }  private static void grantAccessBasedOnRole(User user) {  switch (user.getRole()) {  case "admin":  System.out.println("Admin access granted.");  break;  case "user":  System.out.println("User access granted.");  break;  default:  System.out.println("Access denied.");  break;  }  }  
}

在这个改进的版本中,我们通过提前返回(return)来减少嵌套的深度。我们还引入了一个新的方法grantAccessBasedOnRole来处理基于角色的访问控制,这进一步提高了代码的可读性和可维护性。

1. 示例中的User

为了完整起见,这里是一个简单的User类,用于上述示例:

public class User {  private String name;  private String role;  private boolean authenticated;  public User(String name, String role, boolean authenticated) {  this.name = name;  this.role = role;  this.authenticated = authenticated;  }  public String getName() {  return name;  }  public String getRole() {  return role;  }  public boolean isAuthenticated() {  return authenticated;  }  
}

2. 测试代码

我们可以使用以下代码来测试上述的AccessControl类:

public class Main {  public static void main(String[] args) {  User admin = new User("Alice", "admin", true);  User user = new User("Bob", "user", true);  User guest = new User("Charlie", "guest", true);  User unauthenticatedUser = new User("David", "user", false);  User nullUser = null;  AccessControl.checkAccess(admin); // 输出: Admin access granted.  AccessControl.checkAccess(user); // 输出: User access granted.  AccessControl.checkAccess(guest); // 输出: Access denied.  AccessControl.checkAccess(unauthenticatedUser); // 输出: User is not authenticated.  AccessControl.checkAccess(nullUser); // 输出: User is null.  }  
}

首先,我们可以为User类添加一些更多的属性和方法,使其更加真实和实用。

3. 扩展的User

public class User {  private String username;  private String password; // 新增密码属性  private String role;  private boolean isAuthenticated;  public User(String username, String password, String role) {  this.username = username;  this.password = password;  this.role = role;  this.isAuthenticated = false; // 初始未认证  }  // Getters and Setters  public String getUsername() {  return username;  }  public void setUsername(String username) {  this.username = username;  }  public String getPassword() {  return password;  }  public void setPassword(String password) {  this.password = password;  }  public String getRole() {  return role;  }  public void setRole(String role) {  this.role = role;  }  public boolean isAuthenticated() {  return isAuthenticated;  }  public void setAuthenticated(boolean authenticated) {  isAuthenticated = authenticated;  }  // 新增认证方法  public boolean authenticate(String password) {  if (this.password.equals(password)) {  this.isAuthenticated = true;  return true;  }  return false;  }  
}

4. 扩展的AccessControl

我们可以在AccessControl类中添加一个登录方法,用于处理用户的认证。

public class AccessControl {  // ... 之前的代码 ...  // 新增登录方法  public static boolean login(User user, String password) {  return user.authenticate(password);  }  
}

5. 扩展的测试类Main

public class Main {  public static void main(String[] args) {  // 创建用户并设置初始密码和角色  User admin = new User("adminUser", "adminPass", "admin");  User user = new User("regularUser", "userPass", "user");  // 尝试登录并验证权限  if (AccessControl.login(admin, "adminPass")) {  System.out.println("Admin logged in successfully.");  checkAccess(admin); // 假设这是一个单独的方法,用于打印访问权限信息  } else {  System.out.println("Admin login failed.");  }  if (AccessControl.login(user, "userPass")) {  System.out.println("User logged in successfully.");  checkAccess(user); // 假设这是一个单独的方法,用于打印访问权限信息  } else {  System.out.println("User login failed.");  }  }  // 新增一个方法来检查并打印用户访问权限信息  private static void checkAccess(User user) {  if (user.isAuthenticated()) {  switch (user.getRole()) {  case "admin":  System.out.println("Admin access granted. Full permissions.");  break;  case "user":  System.out.println("User access granted. Limited permissions.");  break;  default:  System.out.println("Unknown role. Access denied.");  break;  }  } else {  System.out.println("User is not authenticated. Access denied.");  }  }  
}

在这个扩展的示例中,我们为用户添加了一个密码属性,并允许用户通过authenticate方法进行认证。AccessControl类现在提供了一个login方法,用于处理登录逻辑。测试类Main中,我们创建了两个用户(管理员和普通用户),并尝试使用正确的密码登录。登录成功后,我们调用checkAccess方法来验证和打印出用户的访问权限信息。

这个示例现在更加完整,并且具有实际的应用价值,因为它模拟了一个简单的用户认证和权限检查系统。

相关文章:

Java 代码规范if嵌套

在Java编程中,过度的if嵌套会使代码难以阅读和维护。为了遵循良好的代码规范,我们应尽量减少嵌套的深度。这通常可以通过重新组织代码或使用其他结构(如switch语句,或者将逻辑封装到单独的方法中)来实现。 以下是一个…...

ASPICE如何确保汽车软件产品质量的稳固基石

ASPICE通过一系列的方法和原则来保障汽车软件产品的质量,以下是其保障产品质量的几个关键方面: 制定明确的质量方针和目标: ASPICE要求组织制定明确的质量方针和目标,这些方针和目标与客户需求和预期相一致。 开发团队需要定义软…...

【深度学习】yolov8-seg分割训练,拼接图的分割复原

文章目录 项目背景造数据训练 项目背景 在日常开发中,经常会遇到一些图片是由多个图片拼接来的,如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢,这是文本要做的事情。 造数据 假设拼接方式有…...

Python升级打怪—Django入门

目录 一、Django简介 二、安装Django 三、创建Dajngo项目 (一) 创建项目 (二) 项目结构介绍 (三) 运行项目 (四) 结果 一、Django简介 Django是一个高级Python web框架,鼓励快速开发和干净、实用的设计。由经验丰富的开发人员构建,它解决了web开…...

leetcode面试题17.最大子矩阵

sooooooo long没刷题了,汗颜 题目链接:leetcode面试题17 1.题目 给定一个正整数、负整数和 0 组成的 N M 矩阵,编写代码找出元素总和最大的子矩阵。 返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和…...

计算机网络:构建联结的基础

目录 1. 网络拓扑结构 1.1 星型拓扑 1.2 环型拓扑 1.3 总线型拓扑 1.4 网状拓扑 2. 传输介质 2.1 双绞线 2.2 同轴电缆 2.3 光纤 2.4 无线电波 3. 协议栈模型 3.1 OSI模型 3.2 TCP/IP模型 4. 网络设备 4.1 交换机 4.2 路由器 4.3 网关 4.4 防火墙 5. IP地址…...

node和npm安装;electron、 electron-builder安装

1、node和npm安装 参考: https://blog.csdn.net/sw150811426/article/details/137147783 下载: https://nodejs.org/dist/v20.15.1/ 安装: 点击下载msi直接运行安装 安装完直接cmd打开可以,默认安装就已经添加了环境变量&…...

操作系统概念(黑皮书)阅读笔记

操作系统概念(黑皮书)阅读笔记 进程和内存管理部分章节 导论: 操作系统类似于政府,其本身不能实现任何有用功能,而是提供一个方便其他程序执行有用工作的环境 ​ 个人理解:os是government的作用&#xff0…...

matlab gui下的tcp client客户端编程框架

GUI界面 函数外定义全局变量 %全局变量 global TcpClient; %matlab作为tcpip客户端 建立连接 在“连接”按钮的回调函数下添加以下代码: global TcpClient;%全局变量 TcpClient tcpip(‘192.168.1.10’, 7, ‘NetworkRole’,‘client’); %连接到服务器地址和端…...

Matplotlib : Python 的绘图库

Matplotlib 是一个 Python 的绘图库,广泛用于生成各种静态、动态、交互式的图表。它基于 NumPy,一个用于科学计算的 Python 库。Matplotlib 可以用于生成出版质量级别的图表,并且提供了丰富的定制选项,以适应不同用户的需求。以下…...

数据编织 VS 数据仓库 VS 数据湖

目录 1. 什么是数据编织?2. 数据编织的工作原理3. 代码示例4. 数据编织的优势5. 应用场景6. 数据编织 vs 数据仓库6.1 数据存储方式6.2 数据更新和实时性6.3 灵活性和可扩展性6.4 查询性能6.5 数据治理和一致性6.6 适用场景6.7 代码示例比较 7. 数据编织 vs 数据湖7.1 数据存储…...

CSS(十一)——CSS分组和嵌套,尺寸(Dimension)

CSS 分组 和 嵌套 选择器 分组选择器 举个例子,多个标签有同一个样式,就可以不一个一个分开写,使用分组选择器 比如: h1 {color:green; } h2 {color:green; } p {color:green; } 就可以写为: h1,h2,p {color…...

必备神器!三款优秀远程控制电脑软件推荐

嘿,各位职场小伙伴们,今儿个咱们来聊聊个挺实用又带点“科技范儿”的话题——电脑远程控制那点事儿。作为刚踏入职场不久的新人,我深刻体会到,在这信息爆炸的时代,掌握几招远程操作的技能,简直就是给自个儿…...

关于正运动学解机器人手臂算法

机器人正运动学是机器人学的一个分支,研究机器人的运动和位置之间的关系。它通过解析机器人的结构和关节参数,以及给定的关节角度,来计算机器人的末端执行器的位置和姿态。 机器人正运动学算法通常使用DH(Denavit-Hartenberg&…...

MySQL 约束 (constraint)

文章目录 约束(constraint)列级约束和表级约束给约束起名字(constraint)非空约束(no null)检查约束(check)唯一性约束 (unique)主键约束 (primary key)主键分类单一主键复合主键主键自增 (auto_increment) 外键约束外什…...

用python程序发送文件(python实例二十六)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.文件上传 3.1 代码构思 3.2 服务端代码 3.3 客户端代码 3.4 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具…...

最新源支付系统源码 V7版全开源 免授权 附搭建教程

本文来自:最新源支付系统源码 V7版全开源 免授权 附搭建教程 - 源码1688 简介: 最新源支付系统源码_V7版全开源_免授权_附详细搭建教程_站长亲测 YPay是专为个人站长打造的聚合免签系统,拥有卓越的性能和丰富的功能。它采用全新轻量化的界面…...

HTML:lang属性作用

lang作用 用法常见语言代码优点示例结构效果说明分析HTML 基础结构导航栏内容部分总结 扩展 用法 HTML 文档级别: 在 <html> 标签上使用 lang 属性&#xff0c;指定整个文档的语言。 <!DOCTYPE html> <html lang"en"> <head><meta charse…...

Android SurfaceFlinger——纹理的绘制流程(二十八)

在系统开机动画的播放流程中,会从给定的资源文件中加载纹理数据并初始化一个 OpenGL 纹理对象,这里我们就来解析软件模拟纹理的绘制流程。 一、纹理概述 在 Android 的 SurfaceFlinger 系统组件中,纹理(Texture)是一个核心概念,特别是在涉及到图形渲染和显示的过程中。 …...

深入解析Memcached:C#中的应用与实战案例

目录 Memcached简介Memcached的特点Memcached的工作原理Memcached的应用场景Memcached的安装和配置Memcached与C#的集成 引入依赖配置Memcached客户端C#代码示例 存储数据读取数据删除数据深入解析Memcached 数据存储和过期策略分布式架构性能优化实战案例 缓存数据库查询结果实…...

网易云音乐增强脚本架构解析:基于用户脚本技术的云音乐生态扩展方案

网易云音乐增强脚本架构解析&#xff1a;基于用户脚本技术的云音乐生态扩展方案 【免费下载链接】myuserscripts 网易云音乐油猴脚本:歌曲下载、转存云盘、云盘歌曲快传、云盘匹配纠正... 项目地址: https://gitcode.com/gh_mirrors/my/myuserscripts 项目愿景与价值主张…...

从零到一:基于STM32CubeMX与USB3300的USB HS虚拟串口实战指南

1. 硬件准备与原理图设计 第一次接触STM32F4和USB3300芯片时&#xff0c;我完全被那些密密麻麻的引脚搞懵了。后来才发现&#xff0c;只要跟着CubeMX生成的配置走&#xff0c;硬件设计其实没那么可怕。我的开发板用的是STM32F407VET6&#xff0c;搭配USB3300作为PHY芯片。这里有…...

Bluetooth 蓝牙协议详解

一、协议简介蓝牙&#xff08;Bluetooth&#xff09;短距离无线通信技术&#xff0c;主流分经典蓝牙与BLE 蓝牙 5.0/5.3&#xff08;低功耗蓝牙&#xff09;&#xff0c;多用于近距离设备配对、数据透传、外设连接&#xff0c;消费电子与便携设备最常用。二、基础参数底层标准&…...

如何在Mac上免费一键解锁CrossOver游戏兼容性:CXPatcher完全指南

如何在Mac上免费一键解锁CrossOver游戏兼容性&#xff1a;CXPatcher完全指南 【免费下载链接】CXPatcher A patcher to upgrade Crossover dependencies and improve compatibility 项目地址: https://gitcode.com/gh_mirrors/cx/CXPatcher 想在Mac上流畅运行Windows游戏…...

简单三步让Windows焕然一新:Winhance中文版完整优化指南

简单三步让Windows焕然一新&#xff1a;Winhance中文版完整优化指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-…...

Empire(帝国)CMS 7.5 恶意文件上传-CVE-2018-18086

登录管理员页面&#xff1a;这里经过多次测试&#xff0c;直接上传一句话样本文件的话不生效&#xff08;避坑&#xff09;&#xff0c;并且$符需要做转义&#xff08;避坑&#xff09;,否则&#xff1a;方式1&#xff1a;<?php file_put_contents("getshell.php"…...

利用Taotoken为开源项目提供可配置的AI功能模块

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 利用Taotoken为开源项目提供可配置的AI功能模块 为开源项目集成人工智能能力&#xff0c;正成为提升项目实用性和吸引力的有效方式…...

AI写作检测规避:原理、工具与实践指南

1. 项目概述&#xff1a;为什么我们需要“AI写作检测规避”工具&#xff1f;在内容创作领域&#xff0c;尤其是技术博客、学术写作和日常办公文档中&#xff0c;AI辅助写作工具已经变得无处不在。它们能快速生成草稿、润色语言、甚至构建复杂的技术方案。然而&#xff0c;随之而…...

OdinSerializer扩展开发完全手册:创建自定义序列化组件

OdinSerializer扩展开发完全手册&#xff1a;创建自定义序列化组件 【免费下载链接】odin-serializer Fast, robust, powerful and extendible .NET serializer built for Unity 项目地址: https://gitcode.com/gh_mirrors/od/odin-serializer OdinSerializer是一款专为…...

3步实现网页到Figma设计稿的智能转换:打破开发与设计壁垒

3步实现网页到Figma设计稿的智能转换&#xff1a;打破开发与设计壁垒 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html HTML转Figma工具是一款革命性的Chrome扩展程序&#xff0c;能…...