powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Внутренний статичесский класс
16 сообщений из 16, страница 1 из 1
Внутренний статичесский класс
    #38651925
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня возникли сомнения по поводу правильности реализации следующего:
автор- В ситуациях, где явно не нужно использовать ссылку на внешний класс, реализовывайте внутренние классы статическими.
- Хорошим же тоном при архитектурном проектировании служит полное избегание изменяемых статических объектов, зачастую существует лучшая альтернатива.

1) Учитывая вышесказанное, правильно ли будет делать AlarmTask как статик класс, он же тоже внутренний ?
2) Не будет тут утечек памяти?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
public class GeneralThreadRun {
	public static void main(String[] args) throws InterruptedException {
		GeneralThread gt = new GeneralThread();
		new Thread(gt).start();
		Thread.sleep(1000);
		gt.getAlarm();
		Alarm.timer.cancel();
	}
}

class GeneralThread implements Runnable {
	@Override
	public void run() {
			Calendar cal = Calendar.getInstance();
			cal.add(Calendar.SECOND, 5);		
			long time = cal.getTimeInMillis() - System.currentTimeMillis();
			Date date = new Date(System.currentTimeMillis() + time);
			new Alarm(date);
	}

	public void setAlarm(Alarm alarm) {
		this.alarm = alarm;
	}

	static class Alarm {
	    static Timer timer;
	    public Alarm(Date date) {
	        timer = new Timer();
	        timer.schedule(new AlarmTask(), date);
	    }
		private static class AlarmTask extends TimerTask {
	        public void run() {
	        	System.out.println("alarm");
	            timer.cancel();
	        }
	    }
	}
}
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38651929
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по ошибке оставил gt.getAlarm(); и public void setAlarm(Alarm alarm) { this.alarm = alarm; }
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38651951
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174- В ситуациях, где явно не нужно использовать ссылку на внешний класс, реализовывайте внутренние классы статическими.

Ну, вполне разумно. Статический внутренний класс не связан с экземпляром, поэтому будет меньше связность между внешним классом и внутренним. Что хорошо для будущих рефакторингов.

rema174- Хорошим же тоном при архитектурном проектировании служит полное избегание изменяемых статических объектов, зачастую существует лучшая альтернатива.
Я бы не стал называть "дизайн", который по-сути "тактика", "архитектурой", которая по-сути - "стратегия".
"полное избегание изменяемых статических объектов" - это вынос мозга какой-то. Похоже на кривой перевод.
Мне даже понять сложно что под этим имеется ввидуи почему.

rema1741) Учитывая вышесказанное, правильно ли будет делать AlarmTask как статик класс, он же тоже внутренний ?

Да, по-умолчанию внутренний класс лучше делать статическим, пока явно не требуется обратного.

rema1742) Не будет тут утечек памяти?

Утечки класса это рантайм. Они возникают из-за того как код реализован в методах, а не из-за структуры классов. Но, конечно, нужно понимать, что ссылка на объект внутрений не статического класса держит ссылку на экземпляр внешнего класса. Соответсвенно если внутренний класс это слушатель и мы его где-то привязываем в глобальные реестр, логично и очевидно, что объект внешнего класса тоже будет привязан.

Количетво WTF на строчку кода зашкаливает, поэтому коментировать код не берусь.
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652014
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz"полное избегание изменяемых статических объектов" - это вынос мозга какой-то. Похоже на кривой перевод. Мне даже понять сложно что под этим имеется ввидуи почему. тут речь о том что статическая переменная хранится своим классом, а как следствие, его загрузчиком(classloader). По причине внешнего использования увеличивается шанс, что сборщик мусора не соберёт данный экземпляр. Также зачастую в static-переменных кэшируется информация или же хранятся состояния, используемые несколькими потоками.

BlazkowiczКоличетво WTF на строчку кода зашкаливает, поэтому коментировать код не берусь.по-моему, там все достаточно прозрачно. это не самостоятельный код - просто конкретный момент общей ситуации.
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652033
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174тут речь о том что статическая переменная хранится своим классом, а как следствие, его загрузчиком(classloader). По причине внешнего использования увеличивается шанс, что сборщик мусора не соберёт данный экземпляр. Также зачастую в static-переменных кэшируется информация или же хранятся состояния, используемые несколькими потоками.
Не виже связи между статическим полем и внутренним статичским классом. Вы начали тему про вложеные классы, а здесь зачем-то пишете про поля. Разные же сущности, разные проблемы.


rema174по-моему, там все достаточно прозрачно. это не самостоятельный код - просто конкретный момент общей ситуации.
Ну, как для демонстрации, слишком много мусора. Можно же было как-то проще описать. Статическое поле внутри Alarm в комбинации с кодом в конструкторе, а так же конструирование объекта без явного сохранения ссылки на него - уже попахивают на весь форум.
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652074
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz Статическое поле внутри Alarm в комбинации с кодом в конструкторе
конкретно такое использование аларм я нашел на стаковерфлоу...
а что не так про статическое поле? вы же сами говорили, что AlarmTask правильно сделан статическим.
если timer сделать не статическим, то понадобится сделать класс AlarmTask не статическим, чтобы исользовать в run() -> timer.cancel();

Blazkowiczтак же конструирование объекта без явного сохранения ссылки на него
это про new Alarm(date); ? или new Thread(gt) ? или new AlarmTask() ?
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652093
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174конкретно такое использование аларм я нашел на стаковерфлоу...

Иногда нужно иметь своё мнение.

rema174а что не так про статическое поле?

Оно не final и не синглтон. Можно сколько угодно раз перезаписывать и не известно какой именно экземпляр будет "отменен" при вызове Alarm.timer.cancel().

rema174вы же сами говорили, что AlarmTask правильно сделан статическим.

И?

rema174если timer сделать не статическим, то понадобится сделать класс AlarmTask не статическим, чтобы исользовать в run() -> timer.cancel();

Есть 100500 способов передать ссылку. Вы же оправдываете один кривой способ, ещё большей кривостью другого. Но почему их всего два?

rema174это про new Alarm(date);

Да, реальный говнокод. Зачем нужен конструктор экземпляра, задача которого просто заполнить статическое поле? Не логичнее ли было специальный setter для этого поля завести? Экземпляр создаётся и нигде не используется. Даже сам себя не регистриурет, что тоже было бы криво, но всё же. И это всё должно наводить на мысль. А на кой нам вообще конструктор в Alarm?

rema174 или new Thread(gt) - экземпляр используется для вызова метода. Очевидно же.
rema174 или new AlarmTask() ? - экземпляр используется как аргумент метода. Очевидно же.
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652129
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczИногда нужно иметь своё мнение. Лишь бы свое мнение не было оправданием для критики другого мнения, отличного от своего...

Blazkowiczrema174вы же сами говорили, что AlarmTask правильно сделан статическим.
И? это горилось в контесте всего абзаца и читаться должно было тоже в контесте...

BlazkowiczЕсть 100500 способов передать ссылку. Вы же оправдываете один кривой способ, ещё большей кривостью другого. Но почему их всего два?если вам ближе какой-то другой способ, то я воспользуюсь цитатой: Иногда нужно иметь своё мнение.

BlazkowiczЗачем нужен конструктор экземпляра, задача которого просто заполнить статическое поле? Не логичнее ли было специальный setter для этого поля завести? Экземпляр создаётся и нигде не используется. Даже сам себя не регистриурет, что тоже было бы криво, но всё же. И это всё должно наводить на мысль. А на кой нам вообще конструктор в Alarm?
Конструктор экземпляра не просто заполняет статическое поле, так еще и метод вызывается, ага?
Завести сеттер - может глобально и классически правильно и знакомо, но конкретно там - это еще больше строчек кода. Сделай сеттер, создай экземпляр, заполни его, а потом и метод вызови, а тут, сразу аргументом передали, заполнили и там же вызвали метод... быстро. точка. Хотел было процитировать про 100500 способов... но обойдусь упоминанием :)
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652160
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174BlazkowiczЕсть 100500 способов передать ссылку. Вы же оправдываете один кривой способ, ещё большей кривостью другого. Но почему их всего два?если вам ближе какой-то другой способ, то я воспользуюсь цитатой: Иногда нужно иметь своё мнение. В данном конкретном случае будет лучше прислушаться к мнению народа, а не к своему.
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652168
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174Завести сеттер - может глобально и классически правильно и знакомо, но конкретно там - это еще больше строчек кода.
Бред. Есть WTF код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public void run() {
    new Alarm(date);
}

static class Alarm {
    static Timer timer;
    public Alarm(Date date) {
        timer = new Timer();
        timer.schedule(new AlarmTask(), date);
    }
}


И совершенно аналогичный, но уже нормально читаемый.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public void run() {
    Alarm.setup(date);
}

static class Alarm {
    static Timer timer;
    public static void setup(Date date) {
        timer = new Timer();
        timer.schedule(new AlarmTask(), date);
    }
}


С фига ли в нем больше строк?
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652173
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rema174Лишь бы свое мнение не было оправданием для критики другого мнения, отличного от своего...
Ну, вот. Обидки начались. Вы привели код (логично предположить что вы его автор, так как иного не указано). Я вам резонно задал вопрос\критику по коду. Вы вместо ответа получил железный аргументе - "я это увидел на stackoverflow". Ну, ок. Тогда зачем его было сюда вываливать?

rema174это горилось в контесте всего абзаца и читаться должно было тоже в контесте...
У меня память на контексты ограничена. Нужно либо цитировать. Либо писать полные самостоятельные предложения. Тогда будет больше шансов получить на столько же полный ответ.

[quot rema174]если вам ближе какой-то другой способ, то я воспользуюсь цитатой: Иногда нужно иметь своё мнение.
Нить разговора окончательно утеряна. Надеюсь кто-то другой разъяснит понятнее. Удачи.
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652229
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
new Alarm(date);

постоянно встречаешь такую конструкцию. пусть этот экземпляр создаётся и нигде не используется... он выполнил что надо и был собран gc

Blazkowicz но уже нормально читаемыйчиталось имхо и так нормально
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652236
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652249
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:-)
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652305
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что будет, если сделать так:
Код: java
1.
2.
new Alarm(date1);
new Alarm(date2);

?
...
Рейтинг: 0 / 0
Внутренний статичесский класс
    #38652412
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
второй будильник не завершится...

если же сделать AlarmTask не статик, то оба завершатся, как-то не понятно получается...

слегка изменил, так работает:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
public class GeneralThreadRun {
	public static void main(String[] args) throws InterruptedException {
		GeneralThread gt = new GeneralThread();
		new Thread(gt).start();
	}
}

class GeneralThread implements Runnable {
	
	@Override
	public void run() {
			Calendar cal = Calendar.getInstance();
			cal.add(Calendar.SECOND, 5);		
			long time = cal.getTimeInMillis() - System.currentTimeMillis();
			Date date = new Date(System.currentTimeMillis() + time);
			new Alarm(date);
			try {Thread.sleep(100);} catch (InterruptedException e) { }
			new Alarm(new Date(System.currentTimeMillis() + time));
	}

	static class Alarm {
		Timer timer;
		public Alarm(Date date) {
	        timer = new Timer();
	        timer.schedule(new AlarmTask(), date);
	    }
		private class AlarmTask extends TimerTask {
	        public void run() {
	        	System.out.println("alarm");
	            timer.cancel();
	        }
	    }
	}
}
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Внутренний статичесский класс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]