繁体   English   中英

通过 getter 方法从列表中获取值?

[英]Take a value from a list through a getter method?

我有 3 个类,人类、日期和十二生肖。 在 Date 我有两种 int 类型,月和日。 我有普通的构造函数和吸气剂。 在人类中,我有一个字符串名称和一个来自日期类型的生日。

我的 Class 日期:

public class Date {
    private int month;
    private int day;
    
    public Date(int month, int day) {
        this.month = month;
        this.day = day;
    }
    public int getMonth() { return month;}

    public int getDay() {return day;}

我的 Class 人类

public class Human {
    private String name;
    private Date birthday;

    public Human(String name, Date birthday) {
        this.name = name;
        this.birthday = birthday;
    }

   public String getName() { return name;}
   
   public BirthDate getBirthday() { return birthday;}

在我的 class Zodiac 中,我有一个 Main,我在其中创建了一些对象。 然后我有一个方法 zodiacToHuman 如果我给一个人类他的星座。 但这种方法根本不起作用。 该方法有一个列表作为参数并返回一个 Map。

我在 class Zodiac 中的方法:

public static Map<Human, String> zodiacToHuman(List<Human> humanlist){
     Map<Human, String> personSign = new HashMap<>();
     Human human;
     String sign = "";
     int day = Date.getDay();
     int month = Date.getMonth();
     if (month == 1) {
            if (day < 20)
                sign = "capricornus";
                humanSign.put(human, sign);
            else
                sign = "aquarius";
                humanSign.put(human, sign);
     }//and so on
}

这是我得到的错误:

不能从 static 上下文引用非静态方法“getDay()”

不能从 static 上下文中引用非静态方法“getMonth()”

变量 Human 可能尚未初始化

有人能帮我吗?

你不能做int day = Date.getDay()

创建日期 class 的第一个 object 并使用它来获取日期和月份

Data date = new Date()
int day = date.getDay()
int month = date.getMonth()

此外,您还没有初始化您的 Human class object。 你可以写

Human human = new Human(some_day, some_month)

据我了解,humanList 包含人类对象的条目。 您应该尝试遍历列表,就像这样

public static Map<Human, String> zodiacToHuman(List<Human> humanlist) {
     Map<Human, String> personSign = new HashMap<>();
     for (Human human : humanList) {
       String sign = "";
       int day = human.getBirthday().getDay();
       int month = human.getBirthday().getMonth();
       if (month == 1) {
            if (day < 20) {
                sign = "capricornus";
            } else {
                sign = "aquarius";
            }
       }  //and so on

       humanSign.put(human, sign);
    }
}

让我们将Date的名称更改为更精确的MonthWithDay

我们可以通过记录来缩短 class 的代码。 默认情况下,隐式创建的 getter 方法的名称与成员字段名称相同。

public record MonthWithDay( int month , int day ) { }

同样,我们可以将您的Human class 定义为一条短行中的记录。

public record Human( String name , MonthWithDay monthDayWhenBorn ) { }

关于你确定生肖的方法:

public static Map<Human, String> zodiacToHuman(List<Human> humanlist){ …

…不需要static 在您的场景中,这似乎是您的Human class 的一个合理功能。

提示:在面向对象编程中,使用static不是面向对象的。 尽量减少使用static 仅作为最后手段使用。

public record Human( String name , MonthWithDay monthDayWhenBorn )
{
    public String zodiac ( )
    {
        int day = this.monthDayWhenBorn.day();
        int month = this.monthDayWhenBorn.month();
        if ( month == 1 )
        {
            if ( day < 20 )
            { return "capricornus"; }
            else
            { return "aquarius"; }
        }
        return "other";
    }
}

填充一些示例数据。

List < Human > humans =
        List.of(
                new Human( "Alice" , new MonthWithDay( 1 , 11 ) ) ,
                new Human( "Alice" , new MonthWithDay( 1 , 22 ) ) ,
                new Human( "Carol" , new MonthWithDay( 11 , 27 ) )
        );

创建您的 map 的人到黄道带。

Map< Human , String > mapOfHumanToZodiac = new HashMap<>() ;

遍历每个Human object,询问其生肖,然后放入我们的 map。

for ( Human human : humans )
{
    mapOfHumanToZodiac.put( human , human.zodiac() );
}

转储到控制台。

System.out.println( "mapOfHumanToZodiac = " + mapOfHumanToZodiac );

mapOfHumanToZodiac = {Human[name=Alice, monthDayWhenBorn=MonthWithDay[month=1, day=11]]=摩羯座, Human[name=Alice, monthDayWhenBorn=MonthWithDay[month=1, day=22]]=水瓶座, Human[name =Carol, monthDayWhenBorn=MonthWithDay[月=11, 日=27]]=其他}

顺便说一句,在实际工作中,我们会定义一个枚举来表示每个星座,而不是仅仅使用字符串。 这样做可以提供类型安全,确保值有效(避免字符串中的拼写错误),并使代码更具自我记录性

java.time

Java 带有行业领先的日期时间类框架,可在java.time package 中找到。 这些类包括MonthDay class。 所以没必要自己发明。 我们可以删除您的MonthWithDay class。

调整Human class。

public record Human( String name , MonthDay monthDayWhenBorn )  // <-- Use java.time.MonthDay class.
{
    public String zodiac ( )
    {
        int day = this.monthDayWhenBorn.getDayOfMonth();        // <-- Use java.time.MonthDay class.
        int month = this.monthDayWhenBorn.getMonthValue();      // <-- Use java.time.MonthDay class.
        if ( month == 1 )
        {
            if ( day < 20 )
            { return "capricornus"; }
            else
            { return "aquarius"; }
        }
        return "other";
    }
}

更改我们创建示例数据的方式。

List < Human > humans =
        List.of(
                new Human( "Alice" , MonthDay.of( 1 , 11 ) ) ,  // <-- Use java.time.MonthDay class.
                new Human( "Alice" , MonthDay.of( 1 , 22 ) ) ,
                new Human( "Carol" , MonthDay.of( 11 , 27 ) )
        );

我们得到相同的结果。

错误和原因

变量 Human 可能尚未初始化

它不是一个错误,它警告说human变量可能是null因为你只有 decalre 变量human 要初始化,您需要创建一个实例或将 null 分配给它

Human human = new Human(YOUR VALUES);
//or 
Human human = null;

不能从 static 上下文引用非静态方法“getDay()”

不能从 static 上下文中引用非静态方法“getMonth()”

如果不创建 object,则无法直接访问 class 的公共方法。

笔记

根据我的理解,您给每个human一个sign值。您可以在创建每个human object 并随后从中创建 map 时获得相同的值。 例如:

public class Human {
    private String name;
    private Date birthday;
    private String sign;

    public Human(String name, Date birthday) {
        this.name = name;
        this.birthday = birthday;
        assignZodiac();
    }   

    private void assignZodiac(){
        String sign = "";

        //getting birhday month and day values
        int day = birthday.getDay();
        int month = birthday.getMonth(); 

    // your logic of assignment
        if (month == 1) {
                    if (day < 20)
                        sign = "capricornus";
                    else
                        sign = "aquarius";
            }//and so on

    }

//getter setter

}

现在您可以从列表中创建 map。 例如:

    // human list has been already created
    Map<Human,String> humanSign=newHasmap<>();    
    for(Human human : humanList) {
        humanSign.put(human,human.getSign()) //asuming getSign is the getter for sign filed in Human.
    }

另外,我建议您将Date class 名称更改为其他名称,因为java已经有一个同名的 class。 只是为了命名对流

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM