You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java/PostgreSQL:跨类方法访问变量(菜单实现场景)

解决Menu类访问Login类中user_name变量的问题

嘿,我来帮你搞定这个困扰!你现在的核心需求就是让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; // 假设验证通过
    }
}
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;
    }
}
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;
    }
}
public class Menu {
    private void viewOrderHistory() {
        String userName = Login.getInstance().getUserName();
        // 查询该用户的订单历史SQL...
    }
}

重要提醒:

  • 永远不要直接把user_name设为public!用Getter方法可以保证封装性,后续如果要修改用户名的获取逻辑(比如从其他地方取),不用改Menu类的代码。
  • 数据库操作一定要用PreparedStatement代替直接拼接SQL字符串,防止SQL注入攻击,这个非常关键!

内容的提问来源于stack exchange,提问作者AbbyS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:24:12