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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:12:27