【问题标题】:Gender Field in java [duplicate]java中的性别字段[重复]
【发布时间】:2012-07-24 20:57:37
【问题描述】:

我正在创建一个包含三个字段的 Employee 类:姓名、年龄和性别。我需要创建一个性别字段,但用户只能选择男性或女性。我想我必须以布尔形式执行此操作,但我不知道该怎么做。谁能帮帮我?

到目前为止,我有:

public class Employee {

private String name;
private int age;
private boolean gender;
private boolean male;
private boolean female;

public Employee(String name, int age, boolean gender) 
{
    this.name = name;
    this.age = age;

    boolean f = female;
    boolean m = male;

    if (gender = f)
    {
        System.out.print("female");
    }

    else if (gender = m)
    {
        System.out.print("male");
    }
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public boolean isGender() {
    return gender;
}

public void setGender(boolean gender) 
{
    if (gender = f)
    {
        System.out.print("female");
    }

    else if (gender = m)
    {
        System.out.print("male");
    }
}
}

【问题讨论】:

  • 为什么不使用枚举而不是布尔值?
  • 使用枚举更好

标签: java


【解决方案1】:

最好使用枚举来表示性别:

public enum Gender {
    MALE, FEMALE
}

【讨论】:

  • 请注意,性别不仅仅是男性或女性
【解决方案2】:

将性别指定为enum,有其局限性:单个java类中只能设置65535个属性(和方法),这在当今多元化的世界中是不可接受的。

我建议使用BigInteger,它的最大值高达(2 ^ 32) ^ 2147483647

【讨论】:

    【解决方案3】:

    您可以使用boolean 或者您可以创建Gender 枚举:

    在 Gender.java 中:

    public enum Gender {
        MALE,
        FEMALE
    }
    

    在 Employee.java 中:

    public class Employee {
    
        private String name;
        private int age;
        private Gender gender;
    
        public Employee(String name, int age, Gender gender) 
        {
            this.name = name;
            this.age = age;
            this.gender = gender;
            printGender();
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Gender getGender() {
            return gender;
        }
    
        public void setGender(Gender gender) 
        {
            this.gender = gender;
        }
    
        public final void printGender() {
            System.out.println(gender.name().toLower());
        }    
    }
    

    【讨论】:

      【解决方案4】:

      如果您要使用布尔值,则应将其命名为 isMaleisFemale,而不是 isGender。请注意,无论您选择哪个,都可能有人会抱怨他们的性别被视为false。这就是为什么枚举可能是更好的选择的原因。

      布尔值可能不合适的另一个原因是,在某些国家/地区,在某些情况下要求人们披露其性别是非法的。出于这个原因,您可能希望提供一个具有三个选项的枚举:第三个是存储未公开的性别。

      【讨论】:

        【解决方案5】:

        布尔值不合适,默认值也不合适,除非它是 UNKNOWN。您至少需要三个值,也许是四个。有关完整讨论,请参阅 this answer

        【讨论】:

          【解决方案6】:

          从 Java 1.5 开始,该语言支持枚举类型 (enum),非常适合此类问题。

          简单的性别枚举:

          public enum Gender {
              M, F, UNKNOWN
          }
          

          复杂的性别枚举:

          /**
           * Enumeration for reflecting user's gender.
           * @author naXa!
           */
          public enum Gender {
              /** Male. */
              M("Male"),
              /** Female. */
              F("Female"),
              /** Gender is not known, or not specified. */
              UNKNOWN("Unknown");
          
              private final String name;
          
              private Gender(String name) {
                  this.name = name;
              }
          
              /**
               * @return The string representation of this element in the enumeration.
               */
              public String getName() {
                  return this.name;
              }
          }
          

          使用示例:

          Employee employee = new Employee("John Doe", 23, Gender.M);
          

          还要注意enum 的实例是常量,应该遵循常量的命名约定。 IE。您应该将每个字母大写,并用下划线分隔后续单词。按照惯例,下划线字符从不在其他地方使用。

          【讨论】:

            【解决方案7】:

            如果您使用的是 Java 1.5 或更高版本,则可以(并且应该)使用enum types,它提供强类型、方便/独立于实现的命名和可扩展性。

            例子:

            public enum Gender {
                MALE,
                FEMALE,
            }
            
            // usage example
            myEmployee.setGender(Gender.FEMALE);
            

            【讨论】:

              【解决方案8】:

              这里有几个问题。首先,在您的 if 语句中,您使用单个 = 运算符将 fm 的值分配给性别。你需要做 if (gender == true) 或 if (gender == false)。另外,我建议让 true 代表男性或女性,false 代表其他性别。

              【讨论】:

                【解决方案9】:

                布尔方法无用有多种原因之一:

                性别和性别之间的区别区分性别(解剖学 一个人的生殖系统和第二性 特征)从性别(基于性别的社会角色) 人,通常在文化上学习),或个人身份 基于内部意识(性别认同。在 在某些情况下,个人的指定性别和性别不 对齐,结果有时是变性人。

                【讨论】:

                  【解决方案10】:

                  问题中的代码有一些问题。

                  首先。

                  构造函数应该设置 Employee 类的变量的值。男性和女性布尔变量必须在使用前赋值。

                  public class Employee {
                  
                      // other vars
                      private boolean male;
                      private boolean female;
                  
                      public Employee(/*other vars*/, boolean gender) 
                      {
                          /*THIS IS WRONG. male and female values not set
                            so you cant assign anything to f or m. it will be an error.
                          */
                          boolean f = female;
                          boolean m = male;
                  

                  第二个。

                  = 和 == 有不同的含义。 = 将右侧的内容分配给左侧的变量。 == 检查是否相等。

                  //will assign the value of f to gender
                  if (gender = f){
                  
                  // will check for equality
                  if(gender == f){
                  

                  第三。

                  setGender(boolean gender) 方法甚至没有设置性别。

                  //as it should be if you choose to use boolean.
                  public void setGender(boolean gender) 
                  {
                      this.gender = gender;
                  }
                  

                  第四。

                  使用多个布尔变量来检查同一件事会为您的代码中引入错误创造更多机会。例如,每次将男性设置为真时,女性必须设置为假,反之亦然。

                  回答问题。

                  您可以使用一个布尔值而不是问题代码中使用的 3 个布尔值。要么 isMale 要么 isFemale 选择一个你不需要两者。如果 isMale 为 false,则员工为女性。

                  我会使用枚举。你可以阅读Enums here 或 Ted Hopp 的回答

                  【讨论】:

                    【解决方案11】:

                    两个想法:

                    1) 创建一个布尔值,如 isMaleisFemale

                    2) 创建一个只有Gender.MALEGender.FEMALEGender 枚举

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-08-17
                      • 1970-01-01
                      • 2017-09-20
                      • 1970-01-01
                      • 2014-10-23
                      • 2017-09-19
                      相关资源
                      最近更新 更多