Java中使用.equals()比较枚举值时出现用户性别被错误覆盖的问题排查
问题排查与修复方案
你的代码出现两个关键问题,导致性别被错误覆盖且过滤逻辑失效:
1. gender字段被错误声明为static
在User类中,static Gender gender;这个声明意味着所有User实例共享同一个gender变量,而不是每个用户拥有自己独立的性别属性。当你依次创建用户时:
- 先创建Eva(FEMALE),此时类的
gender是FEMALE - 再创建Mike(MALE),类的
gender被覆盖为MALE - 接着创建Dave(MALE),
gender保持MALE - 最后创建Alice(FEMALE),
gender被覆盖为FEMALE
所以最终所有User实例的性别都会变成最后一次设置的FEMALE,这就是你看到其他用户性别被替换的原因。
2. 过滤逻辑错误使用类的静态属性
在Main类的stream过滤中,你写的是:
.filter(user -> Gender.FEMALE.equals(User.gender))
这里User.gender是类的静态字段,不是当前遍历的user实例的性别,所以不管遍历到哪个用户,都是在判断类的全局gender是否为FEMALE,而不是每个用户自己的性别。
修复后的代码
修正后的User类
package com.user; public class User { String name; // 去掉static修饰符,让每个实例拥有独立的gender Gender gender; enum Gender { MALE, FEMALE } public User(String name, Gender gender) { super(); this.name = name; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } // 去掉static,改为实例方法 public Gender getGender() { return gender; } // 去掉static,改为实例方法 public void setGender(Gender gender) { this.gender = gender; } @Override public String toString() { return String.format("User [name= %s, gender= %s]", name, gender.toString()); } }
修正后的Main类
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import com.user.User; import com.user.User.Gender; public class Main { public static void main(String[] args) { List<User> users = new ArrayList<User>(); { users.add(new User("Eva", Gender.FEMALE)); users.add(new User("Mike", Gender.MALE)); users.add(new User("Dave", Gender.MALE)); users.add(new User("Alice", Gender.FEMALE)); } users.stream() // 改为调用实例的getGender()方法,判断当前用户的性别 .filter(user -> Gender.FEMALE.equals(user.getGender())) .collect(Collectors.toList()) .forEach(System.out::println); } }
运行效果
修复后运行代码,会正确输出两个女性用户:
User [name= Eva, gender= FEMALE] User [name= Alice, gender= FEMALE]
同时其他用户的性别(Mike、Dave的MALE)不会被覆盖,每个用户都保留了自己独立的性别属性。
内容的提问来源于stack exchange,提问作者Babi B
相关产品推荐
相关产品推荐

