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方法来验证和打印出用户的访问权限信息。

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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值