WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Что означает "swizzle"(неточный синоним - взбить[коктейль]), например "Swizzle an object?"

Что означает "swizzle"(неточный синоним - взбить[коктейль]), например "Swizzle an object?"


Дата публикации: 17-03-2013

Это означает сериализовать. "To swizzle an object" означает рекурсивно сериализовать созданные объекты.


Я использую возможности ссериализации в 1.1 чтобы сохранить некоторые объекты на диске. Я добавил новое поле в один из моих объектов, который сериализуется и теперь десериализация моих старых объектов больше не работает. Я получаю такое исключение :
java.io.InvalidClassException: MacroData; Local class not compatible


Вам нужно добавить объявление типа

static final long serialVersionUID = 4021215565287364875L;
в модифицированный класс. Актуальное значение этого длинного целого предоставляется утилитой "serialver", которая есть в JDK. Любая отличная от первой версия класса требует, чтобы эта статическая переменная была определена в классе.


Мой код работающий с сокетами выглядит правильным, но не работает!

При использовании сокетов Вы обычно открываете оба входящий и исходящий потоки. TCP соединение является полнодуплексным, но либо отсылающая, либо принимающая стороны могут закрываться независимо. По умолчанию, когда установлено что удаленная сторона закрыла соединение, локальная сторона просто закрывает его. Проверьте, может быть это случается с Вами добавлением соответствующей пары. Используйте tcpdump чтобы проверить это.


Как мне получить соответствие IP адреса и имени хоста?

В Java 1.1 (ранние версии были глюкавыми) используйте:

String host = InetAddress.getByName("211.10.2.119").getHostName();

Как мне встроить якорь (anchor) в URL? Просто поместить его как часть строки в конструктор не работает.

Что-то типа:

URL url = new URL("http://www.my_domain.com/my_page.html");
URL anchor = new URL(url, "#section2");
this.getAppletContext().showDocument(anchor);

Как безопасно сохранить особые типы в обычных контейнерах? Часто бывает необходимо сохранить особые типы объектов, но я не хочу разбивать основные классы памяти чтобы достичь этого, т.к. может возникнуть слишком большое количество подклассов (например, IntegerLinkedList, StringLinkedList и т.д.)

Родовое программирование на Java (приблизительный эквивалент шаблонов в C++) работает приемлемо, когда все java-классы являются подклассами Объекта. Однако существует потенциальная проблема - всегда есть вероятность того, что родовой контейнер будет содержать различные классы объектов.

Предположим, Вы создали родовой класс LinkedList. Как обезопасить типы без необходимости создавать множество подклассов (IntegerLinkedList, StringLinkedList и т.д.)?

Чтобы обойти эту проблему, применените в родовом классе составной конструктор, который будет брать параметр типа "Class" и использовать его вместе с методом "isInstance" этого класса, чтобы гарантировать предполагаемый тип для Объектов, добавленных в контейнер.

public class LinkedList {
Protected Class type = Object.class;

public LinkedList(Class type) { this.type = type; }

public void addElement(Object element) throws Exception
{
if(!type.isInstance( element ))
throw new Exception(
"Ожидаемый элемент типа (" + type + ")" +
" полученный элемент типа (" + element + ")" );
...
}
}
Заметьте, что комментарии в исходном тексте для isInstance() ссылаются на "определенный параметр Класса", намекая, что Вам предлагается написать что-то типа:

public void addElement(Object element) throws Exception
{
Class c = element.getClass();
if(!type.isInstance(c))
Это работает, но документация на isInstance разъясняет, что параметр предпочтительнее сделать Объектом а не Классом. Также заметьте, что в JDK 1.2 имеются "Коллекции", которые обеспечивают гораздо более безопасный и гибкий механизм. Информация об этом содержится на сайте Java в разделе Java Developer Connection: http://java.sun.com/


Как передать в метод переменное число аргументов?

(Легкий способ). Используйте перегрузку метода для поддержки различных параметров. Это упрощает сам вызов, но может выйти из под контроля, если Вы захотите поддерживать большое число разнообразных типов параметров. Когда возникает такая необходимость, стоит задать себе вопрос, грамотно ли организован код Вашей программы?
. (Более запутанный). Используйте массивы. Возможно даже объявлять массивы собственно при вызове, как показано ниже:
foo("Параметр",
new Object[] {"параметр3", "параметр4", new Integer(5)} );
// ...

void foo(String param1, Object param2[]) {
System.out.println(param1);
for (int i = 0; i < param2.length; i++) {
System.out.println(param2[i].toString());
}
}
Используя данный способ, можно передавать даже массивы массивов. Естественно, внутри метода, необходимо суметь правильно определить аргументы и соответственно использовать их.

. В качестве альтернативы можно создать класс, содержащий все возможные поля, которые Вы хотите передавать в метод (плюс булевские переменные для указания, включено данное поле или нет), и сделать объект данного класса параметром метода. Такими же способами можно возвращать различные значения из метода; либо используя массивы, либо объект-оболочку.
Однако, не стоит забывать и мудрые слова профессора Алана Перлиса (Alan Perlis): "Если Ваша процедура имеет больше, чем пол-дюжины параметров, то, вероятно, вы о чем-нибудь забыли". Передача большого количества аргументов в функцию означает, что эта функция плохо организована.


Как возвращать различные объекты в параметре метода? Как передать объект в метод, и заставить метод изменить ссылку так, чтобы она указывала на другой объект при возврате в вызывающий код?

Существует два способа. Очевидный путь - "просто добавить еще один уровень в косвенную адресацию". Поместите объект в другой класс, предназначение которого - быть переданным в качестве параметра, позволяя модифицировать ссылку на несомый объект.

Второй способ - более понятный вариант первого. Передайте объект в односимвольном массиве. Так как массивы сами являются объектами, то это работает.

void jfoo(Object ref[]){
ref[0] = new Object();
}
...
Object kludge[] = new Object[1];
kludge[0]= myObj;
jfoo(kludge);
if (kludge[0] == myObj) ...
else ...
Заметьте, что изменение глобальной переменной/объекта внутри метода является плохим стилем программирования; при этом обычно нарушаются основные конструкции ООП.


Как сделать, чтобы метод возвращал несколько значений?

Можно просто написать функцию, возвращающую Вектор. Это особенно удобно, когда Вы не уверены в количестве возвращаемых значений, т.к. оно зависит от происходящего в методе. Вектор по существу является динамически расширяемым массивом. Регулярные массивы не могут увеличиваться после того, как их объявили - приходится объявлять новый массив большей размерности и перекидывать в него содержимое старого.


Как разместить в памяти многомерный массив?

Есть несколько способов. Если Вам необходим прямоугольный массив, то всю память для него можно выделить за один раз. Следующий пример создает массив 4x5:

int arr[][] = new int[4][5];
Если Вы хотите, чтобы каждый ряд содержал свое число колонок, можете использовать тот факт, что двухразмерный массив на самом деле является массивом массивов. Следующая часть кода размещает в памяти треугольный массив:

int arr[][] = new int[4][]; // размещение массива из четырех рядов
for (int i = 0; i < 4; i++) // инициализация каждого ряда
arr[i] = new int[i + 1]; // ряд i содержит i+1 колонку
Заметьте, что если размещается массив любых объектов (в противоположность примитивным типам), то все ссылки будут по умолчанию "null-ссылками", которые при попытке разыменования могут превратиться в исключения NullPointerException.

Другими словами, после:

int arr[] = new int[4];
можно написать

if (arr[2] == 0)
Однако, после

Integer Iarr[] = new Integer[4];
Вы должны заполнить ссылку на объект перед ее использованием. Hапример,

Iarr[2] = myInt;
или

arr[2] = new Int(27);
перед этим можно написать

if (Iarr[2].equals(myInt))
Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)

Карта сайта: 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, 39, 40, 41

Друзья сайта



Случайная цитата

Натан Ротшильд:

"Кто владеет информацией – тот владеет миром."

Опрос

Какой браузер Вы используете?

Internet Explorer
Google Chrome
Mozilla Firefox
Netscape Navigator
Maxthon Browser
Opera
Mozilla Suite
SeaMonkey
K-Meleon
Safari
Amaya
Avant Browser
SlimBrowser
Другой...