Теперь мне нужно уничтожить класс «Пастух», чтобы закончить действия агента, а затем начать новую игру. Я знаю, что у классов Java есть деструкторы.
blockquote>Вы неправильно поняли кое-что довольно фундаментальное:
В Java нет деструкторов. Вы можете путать деструкторы с финализаторами. Это методы, которые называются после , когда GC решил удалить объект. (Это упрощение ... но реальная точка зрения заключается в том, что финализаторы не имеют отношения к этой проблеме. На самом деле, очень мало случаев, когда финализаторы имеют отношение.)
Вы можете ' т уничтожить объекты. Объекты уничтожаются сборщиком мусора, когда они больше не нужны. Более конкретно, они уничтожаются, когда они недоступны; то есть когда они больше не могут влиять на выполнение программы.
Так что вы делаете?
Прежде всего, забудьте о «уничтожении» объектов. Вместо этого подумайте, как подготовить к следующей игре. Есть два подхода.
Вы можете реализовать метод
reset()
или аналогичный для всех «игровых» объектов, которые необходимо сбросить / повторно инициализировать при запуске новой игры.Вы можете просто уронить все соответствующие «игровые» объекты на пол и создать новые. (GC позаботится о мусоре.)
Или вы можете использовать комбинацию двух подходов; например сбросить объект
Pasture
в исходное состояние и сбросить / воссоздатьShepard
,Sheep
и т. д.
Вот решение, которое дает Вам в последнюю секунду текущего месяца. Можно извлечь часть даты или изменить ее для возврата только дня. Я протестировал это на SQL Server 2005.
select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );
Чтобы понять, как это работает, мы должны посмотреть на dateadd () и datediff () функции.
DATEADD(datepart, number, date)
DATEDIFF(datepart, startdate, enddate)
При выполнении просто самого внутреннего вызова к datediff (), Вы получаете текущее число месяца начиная с метки времени 0.
select datediff(m, 0, getdate() );
1327
Следующая часть добавляет что число месяцев плюс 1 к этим 0 меткам времени, давая Вам начальную точку следующего календарного месяца.
select dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 );
2010-09-01 00:00:00.000
Наконец, внешний dateadd () просто вычитает одну секунду из начинающейся метки времени следующего месяца, давая Вам в последнюю секунду текущего месяца.
select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );
2010-08-31 23:59:59.000
Добавьте один месяц к текущей дате и затем вычтите значение, возвращенное дневной функцией, относился к текущей дате с помощью ДНЯ функций и DATEADD.
dateadd(day, -day(getdate()), dateadd(month, 1, getdate()))
Попробуйте это:
DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, CURRENT_TIMESTAMP) + 1, 0)
SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T00:00:00.000')
Объяснение:
Общий подход: используйте временную функциональность.
SELECT '1990-01-01T00:00:00.000', '1990-01-31T00:00:00.000'
Это литералы ДАТЫ И ВРЕМЕНИ, будучи в первый раз гранулой в первый день и в последний день соответственно того же 31-дневного месяца. То, какой месяц выбран, совершенно произвольно.
SELECT DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP)
Вот в чем разница в целых месяцах между первым днем ссылочного месяца и текущей меткой времени. Давайте назовем это @calc
.
SELECT DATEADD(M, @calc, '1990-01-31T00:00:00.000')
Это добавляет @calc
гранулы месяца к прошлому дню ссылочного месяца, результатом которого является текущая метка времени, 'округленная' к прошлому дню ее месяца. Q.E. D.
DECLARE
@Now datetime,
@Today datetime,
@ThisMonth datetime,
@NextMonth datetime,
@LastDayThisMonth datetime
SET @Now = getdate()
SET @Today = DateAdd(dd, DateDiff(dd, 0, @Now), 0)
SET @ThisMonth = DateAdd(mm, DateDiff(mm, 0, @Now), 0)
SET @NextMonth = DateAdd(mm, 1, @ThisMonth)
SET @LastDayThisMonth = DateAdd(dd, -1, @NextMonth)
Иногда Вам действительно нужно в последний день этого месяца, но часто то, что Вы действительно хотите, должно описать временной интервал этого месяца. Это - лучший способ описать временной интервал этого месяца:
WHERE @ThisMonth <= someDate and someDate < @NextMonth
Для полноты в Oracle Вы сделали бы что-то как...
select add_months(trunc(sysdate,'MM'),1) ...
или
select last_day(sysdate)+1 ...
DATEADD(dd, -1, DATEADD(mm, +1, DATEADD(dd, 1 - DATEPART(dd, @myDate), @myDate)))