проблемы с назначением значений календаря

#java #android #calendar

#java #Android #Календарь

Вопрос:

у меня такая проблема:

у меня есть объект календаря в основном действии:

 public static Calendar today = Calendar.getInstance();
  

в моем втором действии мне нужно установить несколько сигналов тревоги, поэтому я сделал следующее:

 for(int i = 0; i < alarmCounter; i  ){
Calendar calendar = MainActivity.today;

calendar.set(Calendar.HOUR_OF_DAY, alarmHours.get(i));
calendar.set(Calendar.MINUTE, alarmMinutes.get(i));
calendar.set(Calendar.SECOND, 0);

            if (calendar.getTimeInMillis() <= System.currentTimeMillis()) {
                calendar.add(Calendar.DAY_OF_YEAR, 7);
            }
}
  

но когда выполняется условие if и добавляется 7 дней calendar , эти 7 дней также добавляются MainActivity.today . Почему это происходит? Как я могу это решить?

Для меня важно сохранять значения MainActivity.today , потому что я изменяю его значения другим методом, и оно не всегда равно текущей дате.

Ответ №1:

Это проблема с указателем памяти.

Оба calendar и MainActivity.today указывают на одно и то же Calendar значение.

Если вы хотите сохранить их разделенными, вы можете использовать метод clone():

 Calendar calendar = (Calendar)MainActivity.today.clone(); 
  

Ответ №2:

Вы неправильно работаете со своими ссылками. Что вам нужно, так это создать совершенно новый объект clone, чтобы не изменять состояние MainActivity.today . Вот как это должно выглядеть:

 import java.util.Calendar;
import java.util.GregorianCalendar;

public class MainActivity {
    private Calendar calendar;

    public MainActivity() {
        this.calendar = new GregorianCalendar();
    }

    public Calendar getToday() {
        return calendar;
    }
}



public class Main {
    public static void main(String[] args) {
        Calendar calendar = (Calendar) new MainActivity().getToday().clone();

        calendar.set(Calendar.HOUR_OF_DAY, 2); //set some dummy values
        calendar.set(Calendar.MINUTE, 2);
        calendar.set(Calendar.SECOND, 0);

        if (calendar.getTimeInMillis() <= System.currentTimeMillis()) {
            calendar.add(Calendar.DAY_OF_YEAR, 7);
        }
    }
}  
  

Отказ от ответственности: хотя это не лучший стиль кода, он помогает решить проблему, с которой столкнулся новичок.

Ответ №3:

Вот как работает ссылка. Вы в основном работаете над экземпляром календаря MainActivity. Итак, вы не хотите этого делать. Используйте это так

 Calendar calendar = Calendar.getInstance();
calendar.setTime(MainActivity.today.getTime();