Search code examples
javastringequals

Comparing enum values using .equals() replaces the string being compared


I have two classes: The main and the user classes. In the main class I wish to print out all the female users. However, when I do the comparison it replace all the genders of the other users to female too

This is the user class

package com.user;

public class User {

    String name;
    static 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;
    }

    public static Gender getGender() {
        return gender;
    }

    public static void setGender(Gender gender) {
        User.gender = gender;
    }

    @Override
    public String toString() {
        return String.format("User [name= %s, gender= %s]", name,gender.toString());
    }
}

The main class

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()
                .filter(user -> Gender.FEMALE.equals(User.gender))
                .collect(Collectors.toList())
                .forEach(System.out::println);
        }
}

Please, where did I go wrong?


Solution

  • You are declaring the gender as a static member in your User class.

    edit:

    To make the solution more clear for you, and combining what other contributors wrote in comments:

    public class User {
    
        String name;
        Gender gender;
    

    and then

    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()
                .filter(user -> Gender.FEMALE.equals(user.gender)) // user not User
                .collect(Collectors.toList())
                .forEach(System.out::println);
            }
    }