#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();