Java Swing函数式编程登录逻辑错误排查求助
问题分析与解决方案
核心问题
你遇到的管理员登录失败问题,根源是User类未正确重写equals()方法。Java中默认的Object.equals()仅比较对象的内存引用,而你代码中:
- 管理员实例是
new User("a","a") - 登录时的用户实例是
new User(username, passwordStr)
这两个是不同的对象引用,所以adminUser.filter(u -> u.equals(login))永远返回空Optional,直接进入else分支触发错误提示。
解决方案
1. 重写User类的equals和hashCode方法
必须基于username和password字段实现对象相等性判断,代码如下:
import java.util.Objects; public class User { private String username; private String password; // 构造方法、getter/setter等省略 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(username, user.username) && Objects.equals(password, user.password); } @Override public int hashCode() { return Objects.hash(username, password); } // 你的login方法逻辑 public boolean login(String password) { // 这里应该是验证逻辑,比如对比数据库存储的密码等 return this.password.equals(password); } }
2. 优化登录逻辑(可选)
如果追求代码简洁性,可以简化Optional的嵌套使用,或者直接用条件判断:
String username = txtUsername.getText(); String passwordStr = String.valueOf(txtPassword.getPassword()); User loginUser = new User(username, passwordStr); // 定义管理员常量,避免重复创建对象 final User ADMIN_USER = new User("a", "a"); if (ADMIN_USER.equals(loginUser)) { this.setVisible(false); new HomePageAdmin().setVisible(true); } else if (loginUser.login(passwordStr)) { this.setVisible(false); new HomePagePeople(username).setVisible(true); } else { JOptionPane.showMessageDialog(null, "Wrong Credential"); }
如果坚持函数式风格,简化后的Optional写法:
Optional.of(loginUser) .filter(ADMIN_USER::equals) .ifPresentOrElse( u -> { this.setVisible(false); new HomePageAdmin().setVisible(true); }, () -> Optional.of(loginUser) .filter(u -> u.login(passwordStr)) .ifPresentOrElse( u -> { this.setVisible(false); new HomePagePeople(username).setVisible(true); }, () -> JOptionPane.showMessageDialog(null, "Wrong Credential") ) );
关于你尝试的错误写法说明
当你把adminUser.filter(u -> u.equals(login))改为u.equals(loginAdmin)时,adminUser本身就是Optional.of(loginAdmin),所以filter条件永远为true,导致任何输入都会进入管理员页面,这是逻辑错误。
内容的提问来源于stack exchange,提问作者Virist
相关产品推荐
相关产品推荐

