Часть лучшего использования, которое я имел для дополнительных методов, является способностью к:
sealed
. , Берут, например, IEnumerable<T>
. В то время как это богато дополнительными методами, я нашел это раздражающим, что это не реализовало универсальный метод ForEach. Так, я сделал свое собственное:
public void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
foreach ( var o in enumerable )
{
action(o);
}
}
Вуаля, весь мой IEnumerable<T>
объекты независимо от реализации типа, и записал ли я это или кто-то еще действительно теперь имел ForEach
метод путем добавления соответствующего оператора "использования" в моем коде.
Обновление, май 2012 г. (2 с половиной года спустя)
Трейказ комментарии:
В текущих версиях Java этот код обработки сигналов не работает из-за ошибки "
INT
«сигнал» зарезервирован виртуальной машиной или ОС ».
Кроме того, ни одно из других допустимых имен сигналов на самом деле не срабатывает, когда что-то запрашивает закрытие приложения (я просто тщательно протестировал все те, о которых мог узнать ...)
Хук выключения в основном работает, но мы обнаруживаем, что в нашем случае он не срабатывает, поэтому следующий шаг, очевидно, - прибегнуть к регистрации обработчика за спиной JVM
Глава « Интеграция обработки сигналов и исключений ] »в« Руководстве по поиску и устранению неисправностей для HotSpot VM »упоминаются сигналы« SIGTERM
, SIGINT
, SIGHUP
»только для ОС Solaris и Linux.
Упоминается только обработка исключений в Windows.
Исходный ответ (сентябрь 2009 г.)
ShutdownHook должен иметь возможность обрабатывать этот случай
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
// what you want to do
}
}));
(с оговорками )
См. Также:
в качестве иллюстрации простой обработки сигналов:
public class Aaarggh {
public static void main(String[] args) throws Exception {
Signal.handle(new Signal("INT"), new SignalHandler () {
public void handle(Signal sig) {
System.out.println(
"Aaarggh, a user is trying to interrupt me!!");
System.out.println(
"(throw garlic at user, say `shoo, go away')");
}
});
for(int i=0; i<100; i++) {
Thread.sleep(1000);
System.out.print('.');
}
}
}