Java/PostgreSQL:跨类方法访问变量(菜单实现场景)
嘿,我来帮你搞定这个困扰!你现在的核心需求就是让Menu类能拿到Login类里用户输入的user_name变量,对吧?下面给你几个实用的实现方案,你可以根据自己的代码结构来选:
方案1:构造方法/方法参数传递(最直观安全的方式)
这是最常用的做法——当Login类验证用户成功后,把user_name作为参数传递给Menu类,Menu类把它存为自己的成员变量,后续菜单选项直接用就行。
Login类中的调用逻辑:
public class Login { public void doLogin() { // 1. 获取用户输入的用户名、密码 Scanner scanner = new Scanner(System.in); String user_name = scanner.nextLine(); String password = scanner.nextLine(); // 2. 数据库验证逻辑(这里简化处理) boolean isValid = validateFromDB(user_name, password); if (isValid) { // 验证通过,把用户名传给Menu实例 Menu menu = new Menu(user_name); menu.displayMenu(); } else { System.out.println("登录失败!"); } } // 模拟数据库验证方法 private boolean validateFromDB(String username, String pwd) { // 执行SQL查询:SELECT * FROM users_ WHERE user_name = ? AND password = ? // 注意一定要用PreparedStatement防止SQL注入! return true; // 假设验证通过 } }
Menu类的实现:
public class Menu { private String currentUserName; // 存储当前登录用户的用户名 // 构造方法接收用户名 public Menu(String userName) { this.currentUserName = userName; } public void displayMenu() { // 展示菜单选项 System.out.println("1. 查看我的资料"); System.out.println("2. 修改密码"); // ...其他选项 Scanner scanner = new Scanner(System.in); int choice = scanner.nextInt(); switch(choice) { case 1: viewMyProfile(); break; // ...其他分支 } } private void viewMyProfile() { // 使用currentUserName查询用户资料 String sql = "SELECT * FROM users_ WHERE user_name = ?"; // 用PreparedStatement执行查询,避免SQL注入 try (Connection conn = getDBConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, currentUserName); ResultSet rs = pstmt.executeQuery(); // 处理查询结果... } catch (SQLException e) { e.printStackTrace(); } } }
方案2:给Login类添加Getter方法,传递Login实例
如果Menu类需要访问Login类的其他信息,而不只是user_name,可以把Login的实例传给Menu,然后通过Getter方法获取user_name。
修改Login类:
public class Login { private String user_name; // 其他可能的成员变量,比如用户ID、权限等 // 登录时赋值user_name public boolean doLogin(String inputName, String inputPwd) { boolean isValid = validateFromDB(inputName, inputPwd); if (isValid) { this.user_name = inputName; } return isValid; } // 添加Getter方法获取用户名 public String getUserName() { return this.user_name; } }
Menu类中使用:
public class Menu { private Login loginInstance; public Menu(Login login) { this.loginInstance = login; } private void someMenuOption() { String userName = loginInstance.getUserName(); // 使用userName做业务逻辑 } }
方案3:单例模式(适合单用户登录场景)
如果你的应用是单用户登录的(同一时间只有一个用户操作),可以把Login类做成单例,保存当前登录用户的信息,Menu类直接通过单例实例获取user_name。
单例Login类:
public class Login { private static Login instance; private String user_name; // 私有构造方法,防止外部实例化 private Login() {} // 获取单例实例 public static Login getInstance() { if (instance == null) { instance = new Login(); } return instance; } // 登录方法,验证成功后设置用户名 public boolean login(String inputName, String inputPwd) { boolean isValid = validateFromDB(inputName, inputPwd); if (isValid) { this.user_name = inputName; } return isValid; } public String getUserName() { return this.user_name; } }
Menu类中调用:
public class Menu { private void viewOrderHistory() { String userName = Login.getInstance().getUserName(); // 查询该用户的订单历史SQL... } }
重要提醒:
- 永远不要直接把
user_name设为public!用Getter方法可以保证封装性,后续如果要修改用户名的获取逻辑(比如从其他地方取),不用改Menu类的代码。 - 数据库操作一定要用
PreparedStatement代替直接拼接SQL字符串,防止SQL注入攻击,这个非常关键!
内容的提问来源于stack exchange,提问作者AbbyS
相关产品推荐
相关产品推荐

