Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Феномен transient в совокупности со static 
:(
    Опции темы
Royan
  Дата 25.2.2008, 03:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Народ, попробуйте, пожалуйста откомпилировать у себя, нижеприведенный код в двух маленьких редакциях и сообщить о результатах:

В первой редакции используйте существующий вариант, а во второй уберите из объявления поля time модификатор static

Код

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;

public class SerializationTest implements Serializable {
    private static final long serialVersionUID = 6450775562767208074L;
    
    private transient static Date time;

    public SerializationTest() {
        time = Calendar.getInstance().getTime();
    }

    public Date getTime() {
        return time;
    }

    public void deflate(String fileName) {

        SerializationTest time = new SerializationTest();
        FileOutputStream fos = null;
        ObjectOutputStream out = null;
        try {
            fos = new FileOutputStream(fileName);
            out = new ObjectOutputStream(fos);
            out.writeObject(time);
            out.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public void inflate(String fileName) {

        SerializationTest time = null;
        FileInputStream fis = null;
        ObjectInputStream in = null;
        try {
            fis = new FileInputStream(fileName);
            in = new ObjectInputStream(fis);
            time = (SerializationTest) in.readObject();
            in.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        // print out restored time
        System.out.println("Flattened time: " + time.getTime());
        System.out.println();
        // print out the current time
        System.out.println("Current time: " + Calendar.getInstance().getTime());
    }

    public static void main(String[] args) {
        SerializationTest test = new SerializationTest();
        test.deflate("file.ser");
        test.inflate("file.ser");
    }
}


Лично у меня результат со static такой:
Цитата

Flattened time: Mon Feb 25 03:24:18 MSK 2008
Current time: Mon Feb 25 03:24:18 MSK 2008

а без него, такой
Цитата

Flattened time: null
Current time: Mon Feb 25 03:31:13 MSK 2008


Честно признаюсь первый вариант меня озадачил, если на вашей JVM такой же результат не мог кто-нибудь пролить свет почему transient не оказал влияния?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
ivg
Дата 25.2.2008, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(Royan @  25.2.2008,  03:33 Найти цитируемый пост)
почему transient не оказал влияния?

Оказал, оказал.... smile , если имеется ввиду сериализация.
А вот на результат вывода программы не оказал, именно потому что поле статик.
Если на пальцах: на выводе получаем значение, сохранённое в поле time в конструкторе, вызываемого из 25 строки.
действие в 46 строке никакого влияния на статик поле не оказывает.
PS: Похоже на тест при собеседовании  smile 
PM MAIL   Вверх
duk
Дата 25.2.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Royan, как мне кажется этот пример дает понять смысл и работу статических переменных. 
Начну со второго случая: 
Flattened time: null
Current time: Mon Feb 25 03:31:13 MSK 2008

В данном случае Flattened time: null,  поле  transient - логично чтоб результат был null, а в первом варианте, точно также объект time не сохраняется, но при этом, когда при десериализации (SerializationTest()) объект загружается в память, через статическое поле time, можно получать то значение, которое на данный момент хранится в памяти (тоесть используется актуальное значение,  с которым работают объекты на данный момент).


PM MAIL   Вверх
Royan
Дата 25.2.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Понял спасибо!


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0439 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.