JAVA → Малоизвестные особенности Java. Вторая часть
Как и обещал, предлагаю вашему вниманию следующие пять пунктов.
Малоизвестные особенности Java. Первая часть
6. Конфликт имён.
Если импортированы несколько классов с одним и тем же именем из разных пакетов, возникает конфликт имён. В таком случае при обращении к классу следует указывать его квалифицированное имя, то есть полное имя, включая и имя пакета, например java.lang.String.
Неужели ничего нельзя с этим поделать? Оказывается можно. Следующий код скомпилируется без проблем, несмотря на то, что класс List присутствует и в пакете java.awt, и в пакете java.util:
Достаточно дополнительно импортировать необходимый класс, java.util.List в данном примере.
Тут, как вы заметили, используются кириллические идентификаторы. Да! Для кого-то это станет откровением, но Java… такая Java. Идентификатор может состоять из совершенно любых букв, помимо цифр, знаков подчёркивания и валюты США (однако последний знак ($) использовать не рекомендуется, он предназначен для системных нужд). Но оно нам надо? Разве только в целях обфускации. Только представьте себе, сколько разных идентификаторов можно сгенерировать всего-то из символов «А» английского, русского и греческого алфавитов…
Малоизвестные особенности Java. Первая часть
6. Конфликт имён.
Если импортированы несколько классов с одним и тем же именем из разных пакетов, возникает конфликт имён. В таком случае при обращении к классу следует указывать его квалифицированное имя, то есть полное имя, включая и имя пакета, например java.lang.String.
Неужели ничего нельзя с этим поделать? Оказывается можно. Следующий код скомпилируется без проблем, несмотря на то, что класс List присутствует и в пакете java.awt, и в пакете java.util:
import java.awt.*;
import java.util.*;
import java.util.List;
public class Класс {
public static void main(String... аргументы) {
List простоСписок = Collections.emptyList();
System.out.println(простоСписок);
}
}Достаточно дополнительно импортировать необходимый класс, java.util.List в данном примере.
Тут, как вы заметили, используются кириллические идентификаторы. Да! Для кого-то это станет откровением, но Java… такая Java. Идентификатор может состоять из совершенно любых букв, помимо цифр, знаков подчёркивания и валюты США (однако последний знак ($) использовать не рекомендуется, он предназначен для системных нужд). Но оно нам надо? Разве только в целях обфускации. Только представьте себе, сколько разных идентификаторов можно сгенерировать всего-то из символов «А» английского, русского и греческого алфавитов…
JAVA → Малоизвестные особенности Java из песочницы
Готовясь к собеседованию, я решил освежить память да и вообще поискать каверзные и малоизвестные нюансы языка Java. Выборку пяти наиболее интересных на мой взгляд моментов я вам и предлагаю.
Вот уже подоспела и вторая часть статьи.
1. Нестатические блоки инициализации.
Всем, я думаю, известно, что в Java существуют статические блоки инициализации (class initializers), код которых выполняется при первой загрузке класса.
Но существуют также и нестатические блоки инициализации (instance initializers). Они позволяют проводить инициализацию объектов вне зависимости от того, какой конструктор был вызван или, например, вести журналирование:
Такой метод инициализации весьма полезен для анонимных внутренних классов, которые конструкторов иметь не могут. Кроме того, вопреки ограничению синтаксиса Java, используя их, мы можем элегантно инициализировать коллекцию:
Очень даже мощное средство, не находите?
Остальные четыре пункта под катом.
Вот уже подоспела и вторая часть статьи.
1. Нестатические блоки инициализации.
Всем, я думаю, известно, что в Java существуют статические блоки инициализации (class initializers), код которых выполняется при первой загрузке класса.
class Foo {
static List<Character> abc;
static {
abc = new LinkedList<Character>();
for (char c = 'A'; c <= 'Z'; ++c) {
abc.add( c );
}
}
}Но существуют также и нестатические блоки инициализации (instance initializers). Они позволяют проводить инициализацию объектов вне зависимости от того, какой конструктор был вызван или, например, вести журналирование:
class Bar {
{
System.out.println("Bar: новый экземпляр");
}
}Такой метод инициализации весьма полезен для анонимных внутренних классов, которые конструкторов иметь не могут. Кроме того, вопреки ограничению синтаксиса Java, используя их, мы можем элегантно инициализировать коллекцию:
Map<String, String> map = new HashMap<String, String>() {{
put("паук", "арахнид");
put("птица", "архозавр");
put("кит", "зверь");
}};Очень даже мощное средство, не находите?
JFrame frame = new JFrame() {{
add(new JPanel() {{
add(new JLabel("Хабрахабр?") {{
setBackground(Color.BLACK);
setForeground(Color.WHITE);
}});
add(new JButton("Торт!") {{
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.out.println("Хабрахабр - торт!");
}
});
}});
}});
}};Остальные четыре пункта под катом.
Разработка под Apple iOS → iOS tips and tricks: Динамический Default.png из песочницы
При разработке под iOS время от времени у заказчиков, да и у некоторых программистов возникает закономерный вопрос: «А можно ли каким-нибудь образом при старте приложения подменять картинку?».
Немного порыскав по интернету, и покопавшись в документации, то напрашивается ответ, что сделать это невозможно по следующим причинам:
Однако, все же, это возможно сделать стандартными способами, без всякого рода Jailbreak'а. Впрочем, как и у каждого решения есть свои плюсы, минусы и особенности.
Немного порыскав по интернету, и покопавшись в документации, то напрашивается ответ, что сделать это невозможно по следующим причинам:
- Файл, который показывается при запуске приложения лежит внутри папки приложения, и, ак следовательно переписать его не является возможным
- По аналогичной причине нельзя изменить файл Info.plist, в котором сохраняется относительный путь к файлу стартовым изображением
Однако, все же, это возможно сделать стандартными способами, без всякого рода Jailbreak'а. Впрочем, как и у каждого решения есть свои плюсы, минусы и особенности.
Веб-разработка → Инвертирование страницы только средствами CSS
Я недавно увидела jQuery-плагин Paul Irish для инвертирования страницы. Он инвертирует каждый цвет на странице, включая изображения и CSS. Это мне напомнило о существовании ключевого слова invert для цвета контуров (outline) (к сожалению, поддерживаемом только в Opera и IE9+). В общем, я задумалась, как можно добиться такого же эффекта только средствами CSS.
Оказалось, что это достаточно просто:
Оказалось, что это достаточно просто:
Opera → Пример входа в две учетные записи на одном и том же сайте одновременно, используя Private Tab Opera
У многих из нас есть по нескольку учеток на одном и том же сайте. Если вы зашли под одним именем, обычно вы уже не сможете зайти под другим, потому что куки-общие для всех табов.
В Opera версии 10.5 и выше появились Private Tab, куки с которыми не общие, так что вы можете зайти на сайт с двух учетных записей одновременно. Для вызова Private Tab проделать следующее: правый клик по таб-у > New Private Tab

В Opera версии 10.5 и выше появились Private Tab, куки с которыми не общие, так что вы можете зайти на сайт с двух учетных записей одновременно. Для вызова Private Tab проделать следующее: правый клик по таб-у > New Private Tab

JavaScript → Вызов метода Javascript без его вызова фактически
Иногда мы бываем просто ленивыми. Особенно, когда доходит дело до написания кода. И хоть круглые скобки в вызове функции не приводят к избыточности, иногда все же они могут утомлять, особенно когда javascript-метод не нуждается в передаваемых ему аргументах. Иногда это просто надоедает.Разработка → Открываем URL из под Wine
Представим ситуацию. Наш продукт умеет определять под управлением WineHQ он запущен или нет. И в самом нашем продукте есть множество мест, из которых мы должны открыть URL. Информация о продукте, проверка обновлений, онлайн-справка, страница тех.поддержки и прочее. В лоб пробуем ShellExecute, передавая параметром URL, и… недоуменно разводим руками. Ничего не происходит!
JavaScript → Побит рекорд самого короткого кода по определению IE
Без малого год назад, я уже писал (http://habrahabr.ru/blogs/javascript/50544/) о самом коротком способе определение браузера Internet Explorer, но вот некто Aleko нашел еще более короткий вариант:
Всего 5 байт. Пример использования:
-[1,]Всего 5 байт. Пример использования:
if(-[1,]){
alert("Not IE!");
}
Ruby on Rails → 19 необщеизвестных приёмов
Заметка не новая, но я уверен, что и сейчас не все знают всё нижеперечисленное (Здесь и далее курсив переводчика).
Когда я смотрю на свой, да и на чужой, код на рельсах, я часто вижу нереализованные возможности для применения определённых рельсовых техник. Я бы хотел перечислить некоторые приёмы и советы для повышения эффективности приложения и кода, как памятку для себя и для вас.
Замер скорости в контроллерах — это очень просто. Используйте метод benchmark в любой модели.
Когда я смотрю на свой, да и на чужой, код на рельсах, я часто вижу нереализованные возможности для применения определённых рельсовых техник. Я бы хотел перечислить некоторые приёмы и советы для повышения эффективности приложения и кода, как памятку для себя и для вас.
Замер скорости в контроллерах — это очень просто. Используйте метод benchmark в любой модели.
Delphi → Delphi: Как избавиться от published свойств
Вводная
Работая над PostgresDAC'ом наша комманда встречалась с этой проблемой дважды. И оба раза изменения затрагивали компонент TPSQLDump, как наиболее интенсивно изменяющийся. Это и понятно, каждый серьезный релиз сервера PostgreSQL вносит порой в параметры pg_dump существенные изменения. А нашей задачей является полная совместимость TPSQLDump с pg_dump.