MST

星途 面试题库

面试题:Java类设计原则之中的单一职责原则应用

请举例说明在Java类设计中如何遵循单一职责原则,并说明遵循该原则对代码维护和扩展的好处。
23.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

单一职责原则在Java类设计中的示例

假设我们有一个简单的用户管理系统,涉及用户信息的存储和用户登录功能。如果不遵循单一职责原则,可能会写出如下代码:

public class UserService {
    // 存储用户信息
    public void saveUser(String username, String password) {
        // 实际逻辑可能是将用户信息保存到数据库等持久化存储
        System.out.println("Saving user: " + username + " with password: " + password);
    }

    // 用户登录功能
    public boolean login(String username, String password) {
        // 实际逻辑可能是验证用户名和密码是否匹配
        System.out.println("Attempting to login user: " + username);
        return true;
    }
}

这样的设计中,UserService类承担了两个职责:用户信息存储和用户登录验证。

遵循单一职责原则,我们可以将这两个职责分离到不同的类中:

// 用户信息存储服务类
public class UserStorageService {
    public void saveUser(String username, String password) {
        System.out.println("Saving user: " + username + " with password: " + password);
    }
}

// 用户登录服务类
public class UserLoginService {
    public boolean login(String username, String password) {
        System.out.println("Attempting to login user: " + username);
        return true;
    }
}

遵循单一职责原则对代码维护和扩展的好处

  1. 代码维护
    • 可读性增强:每个类的职责明确,代码结构更加清晰。例如在上述例子中,UserStorageService只专注于用户信息存储,UserLoginService只负责用户登录,开发人员一眼就能看出每个类的作用,无需在一个大而杂的类中寻找特定功能的代码。
    • 修改风险降低:当需要修改用户信息存储的逻辑时,只需要在UserStorageService类中进行修改,而不会影响到UserLoginService类的功能。如果不遵循单一职责原则,在同一个类中修改存储逻辑可能会不小心破坏登录功能,增加了维护成本和引入错误的风险。
  2. 代码扩展
    • 灵活性提高:如果业务需求发生变化,比如需要添加新的用户认证方式,只需要在UserLoginService类中进行扩展,而不会影响到UserStorageService类。同样,如果要改变用户信息的存储方式,也只需对UserStorageService类进行操作,不会干扰到登录相关的代码。
    • 可复用性提升:每个类职责单一,使得这些类更容易在其他项目或模块中复用。例如,在其他需要用户登录功能的项目中,可以直接复用UserLoginService类,而无需连同不相关的用户存储功能一起复用。