вопросы новичка о языке
От: баг  
Дата: 21.09.11 17:05
Оценка:
Впервые столкнулся с этим языком, возникли вопросы.

1. Привычное множественное наследование: есть класс-родитель, есть класс-дитё, есть третий класс с неким функционалом, который хочется использовать, но нельзя.
Какие шаблоны для выхода из ситуации? Третий класс в виде члена дитя, статические методы в персом? Что ещё?

2. Множественные результаты функции. В других языках есть передача по ссылке, в Яве вроде как нету этого. Как прикажете возвращать? Заворачивать в новый класс и возвращать его? Или есть может что-то обобшённое вида туплов (tuple)?

3. Сериализация. В С++ просто: объявил структуру и привёл к ней любой участок памяти. В Яве? Собственный DataInputStream и ObjectInputStream? Или как ещё парсят сетевые бинарные протоколы?

4. Коллбэки. В C++ функторы и указатели на функции, в C# делегаты, а здесь что?

5. Беззнаковые типы
Re: вопросы новичка о языке
От: Blazkowicz Россия  
Дата: 21.09.11 18:16
Оценка:
Здравствуйте, баг, Вы писали:

баг>1. Привычное множественное наследование: есть класс-родитель, есть класс-дитё, есть третий класс с неким функционалом, который хочется использовать, но нельзя.

баг>Какие шаблоны для выхода из ситуации? Третий класс в виде члена дитя, статические методы в персом? Что ещё?
Наследования зачастую не верно используется там где нужна агрегация. Так что множественное наследование хоть и может иногда пригодиться, но не критично.

баг>2. Множественные результаты функции. В других языках есть передача по ссылке, в Яве вроде как нету этого. Как прикажете возвращать? Заворачивать в новый класс и возвращать его? Или есть может что-то обобшённое вида туплов (tuple)?

Если объект возвращает пару значений, значит они логически связаны. Если они логически связаны, то почему они не являются полями одного объекта?
На худой конец можно и туплом с генериками.

баг>3. Сериализация. В С++ просто: объявил структуру и привёл к ней любой участок памяти. В Яве? Собственный DataInputStream и ObjectInputStream? Или как ещё парсят сетевые бинарные протоколы?

Ну, обычно, используют API, который скрывает механизм сериализации от клиетского кода. Т.е. сериализация просто конфигурируется и всё. Непосредственно с Object...Stream работать не приходится. Есть и альтеранвтиыне реализации, например, Hessian.

баг>4. Коллбэки. В C++ функторы и указатели на функции, в C# делегаты, а здесь что?

Анонимные классы. C# делегаты вроде просто скрывают реализию Observer. Ссылки на метод реально не хватает.

баг>5. Беззнаковые типы

Математику на Java пишут мало. Поэтому никто особо не страдает.

Да. И воспользуйтесь, наконец, поиском. Каждый из этих вопросов уже обсуждали.
Re: вопросы новичка о языке
От: 0K Ниоткуда  
Дата: 21.09.11 22:34
Оценка:
Здравствуйте, баг, Вы писали:

баг>4. Коллбэки. В C++ функторы и указатели на функции, в C# делегаты, а здесь что?


Позвольте я вас спрошу. А какая операция не совпадает для знаковых и беззнаковых чисел?

На самом деле только 1-на операция. + и — работают одинаково и для знаковых и для беззнаковых (отображается число при toString по разному, но в памяти совершенно в одинаковом виде хранится).

Кстати, вопрос не такой уж простой. К примеру, разработчики mainsoft, сделавшие утилиту конвертации .Net to Java mainsoft -- этого не знают...
=сначала спроси у GPT=
Re[2]: вопросы новичка о языке
От: gegMOPO4  
Дата: 22.09.11 06:18
Оценка:
Здравствуйте, Blazkowicz, Вы писали:
баг>>4. Коллбэки. В C++ функторы и указатели на функции, в C# делегаты, а здесь что?
B>Анонимные классы. C# делегаты вроде просто скрывают реализию Observer. Ссылки на метод реально не хватает.

Это уж точно. Анонимные классы довольно громоздки:
myButton.addActionListener(new ActionListener()
    {
    @Override
    public void actionPerformed(ActionEvent e)
    {
        frame.toFront();
    }
});

К тому же, каждый анонимный класс — несколько сот байт кода. А их в типичной форме десятки.

В некоторых случаях помогает EventHandler. Вышеприведённые 8 строчек записываются одной. Минусы:
1) Динамика. Нет статического контроля типов, возможны банальные описки, которые отловятся только в рантайме.
2) Методы-обработчики должны быть публичными.
3) Проблема с перегрузкой.
4) Ограниченное применение — только один аргумент, нет возвращаемого значения, нет связанных переменных.
Re: вопросы новичка о языке
От: gegMOPO4  
Дата: 22.09.11 06:47
Оценка: 7 (2)
Здравствуйте, баг, Вы писали:
баг>Впервые столкнулся с этим языком, возникли вопросы.

Если пришли со стороны C/C++, то главное уяснить одну вещь — в Java используются иногда подходы и решения, которые грамотному сишнику и в голову не придут. В частности, нормальным считается кратковременное выделение динамической памяти, множественные проверки всего и вся, многоуровневая косвенность, распространена рефлексия. Как ни странно, это не слишком сказывается на производительности.

баг>1. Привычное множественное наследование: есть класс-родитель, есть класс-дитё, есть третий класс с неким функционалом, который хочется использовать, но нельзя.

баг>Какие шаблоны для выхода из ситуации? Третий класс в виде члена дитя, статические методы в персом? Что ещё?

Множественное наследование и в C++, имхо, было ошибкой. Как уже правильно сказали, правильный ответ — агрегация.

баг>2. Множественные результаты функции. В других языках есть передача по ссылке, в Яве вроде как нету этого. Как прикажете возвращать? Заворачивать в новый класс и возвращать его? Или есть может что-то обобшённое вида туплов (tuple)?


Да, с этим плохо. Но и в C++ не очень хорошо без множественного присваивания и автораспаковки pair/tuple. Да, оборачивают в новый класс. Или модифицируют изменяемый параметр (массив, коллекцию).

баг>3. Сериализация. В С++ просто: объявил структуру и привёл к ней любой участок памяти. В Яве? Собственный DataInputStream и ObjectInputStream? Или как ещё парсят сетевые бинарные протоколы?


Вот в C++ это плохой, ужасный способ. Проблемы с переносимостью — разные размеры, эндинг, представление, выравнивание. Которые могут изменяться даже в одном компиляторе при разных опциях. Проблема с безопасностью — сериализируются и дыры в структуре. Надёжный и безопасный способ — явная упаковка/распаковка в байты, в Java для этого используется DataInputStream или вручную.

баг>4. Коллбэки. В C++ функторы и указатели на функции, в C# делегаты, а здесь что?


Анонимные классы, реализующие интерфейс (аналог функторов C++, но удобнее). Это более универсальный способ, хотя и более громоздкий, по сравнению с указателем на функцию. Выше я упомянул EventHandler, но вам это не надо.

баг>5. Беззнаковые типы


Их нет. Частично это компенсируется беззнаковым сдвигом, BigInteger, BitSet.
Re[3]: вопросы новичка о языке
От: Blazkowicz Россия  
Дата: 22.09.11 06:55
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

MOP>К тому же, каждый анонимный класс — несколько сот байт кода. А их в типичной форме десятки.

Не уверен на счет "типичной формы". Видел много решений и без анонимных, классов. Когда форма сама реализует интерфейсы слушаетелей.
А для множества компонент типа кнопок есть такие классы как Action.

MOP>В некоторых случаях помогает EventHandler. Вышеприведённые 8 строчек записываются одной. Минусы:

Мало чем отличается от делегатов в C#

MOP>1) Динамика. Нет статического контроля типов, возможны банальные описки, которые отловятся только в рантайме.

Как уже заметил, ссылки на метод не хватает очень.
Re[2]: вопросы новичка о языке
От: gegMOPO4  
Дата: 22.09.11 06:57
Оценка: 2 (1)
Здравствуйте, 0K, Вы писали:
0K>Позвольте я вас спрошу. А какая операция не совпадает для знаковых и беззнаковых чисел?

Целочисленное деление, остаток от деления, правый сдвиг (но для этого в Java есть беззнаковый), расширение типа, сравнение. Со смешанным сравнением знаковых и беззнаковых в C/C++ постоянно проблемы, так что где-то авторы Java правы.
Re[4]: вопросы новичка о языке
От: gegMOPO4  
Дата: 22.09.11 07:28
Оценка:
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, gegMOPO4, Вы писали:
MOP>>К тому же, каждый анонимный класс — несколько сот байт кода. А их в типичной форме десятки.
B>Не уверен на счет "типичной формы". Видел много решений и без анонимных, классов. Когда форма сама реализует интерфейсы слушаетелей.

Да, ещё один вынужденный способ. Но в методе-обработчике получаем уродливую ручную диспетчеризацию по источнику (это обычно означает, что и ссылки на подкомпоненты должны быть полями класса). Кроме того, это идеологически некошерно — пабликом точат кишки реализации.

Может форма и нетипичная, но хорошая динамичная форма, со своими валидаторами на поля, с динамическим изменением отображаемых вторичных данных, с изменением доступности, ограничений и значений других полей.

B>Как уже заметил, ссылки на метод не хватает очень.


Да, с этим я и согласился.
Re: вопросы новичка о языке
От: emp  
Дата: 22.09.11 07:45
Оценка:
Здравствуйте, баг, Вы писали:

баг>Впервые столкнулся с этим языком, возникли вопросы.


Добавлю вопрос.

6. Работа с числами с фиксированной точкой (для финансовых расчетов например)
Re[2]: вопросы новичка о языке
От: gegMOPO4  
Дата: 22.09.11 08:16
Оценка:
Здравствуйте, emp, Вы писали:
emp>Добавлю вопрос.
emp>6. Работа с числами с фиксированной точкой (для финансовых расчетов например)

BigDecimal
Re[5]: вопросы новичка о языке
От: 0K Ниоткуда  
Дата: 23.09.11 06:15
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

B>>Как уже заметил, ссылки на метод не хватает очень.

MOP>Да, с этим я и согласился.

А вы не видите противоречия в том, что метод сам по себе существовать не может, а ссылка на него может??? Тогда уж убрать ограничение на методы не классов...
=сначала спроси у GPT=
Re[6]: вопросы новичка о языке
От: Blazkowicz Россия  
Дата: 23.09.11 06:54
Оценка:
Здравствуйте, 0K, Вы писали:

0K>А вы не видите противоречия в том, что метод сам по себе существовать не может, а ссылка на него может??? Тогда уж убрать ограничение на методы не классов...

В Java есть статически типизированая ссылка на класс. Нужно тоже самое но для метода. При чем здесь вообще методы "сами по себе"?
Re[7]: вопросы новичка о языке
От: Baudolino  
Дата: 23.09.11 07:12
Оценка: 1 (1)
B>В Java есть статически типизированая ссылка на класс. Нужно тоже самое но для метода. При чем здесь вообще методы "сами по себе"?
По-хорошему, нужна возможность ссылаться на любые члены класса. Foo#doSomething, Foo#someProperty. Это сразу упрощает, например, поисковые запросы к объектной модели (например, в JPA Criteria API, в котором — ужас-ужас — сейчас генерируются метаклассы).
Re[2]: вопросы новичка о языке
От: баг  
Дата: 23.09.11 09:58
Оценка:
Здравствуйте, gegMOPO4, Вы писали:
MOP>Вот в C++ это плохой, ужасный способ. Проблемы с переносимостью — разные размеры, эндинг, представление, выравнивание. Которые могут изменяться даже в одном компиляторе при разных опциях. Проблема с безопасностью — сериализируются и дыры в структуре. Надёжный и безопасный способ — явная упаковка/распаковка в байты, в Java для этого используется DataInputStream или вручную.
DataInputStream сериализует по-своему, ещё и в network byte order. Мне пришлось самому изобретать велосипед в сериализации, и не факт, что я, впервые сунувшись в мир явы, не допустил ошибок. В C# делал нечто подобное, но там под рукой были структуры, что сильно облегчало задачу, да и рефлекция там проще и одновременно мощнее, как мне показалось. Впрочем, это не холивар, а просто прояснение мнения.

B> Если объект возвращает пару значений, значит они логически связаны. Если они логически связаны, то почему они не являются полями одного объекта?

Писать новый класс ради одного метода не хочется..

B> На худой конец можно и туплом с генериками.

В стандартном хелпе не нашёл. http://javatuples.org ?


B> Да. И воспользуйтесь, наконец, поиском. Каждый из этих вопросов уже обсуждали.

Старожилам форума всегда так кажется, что и вопросы были, и ответы тоже, и поиск рулит. Но это только кажется, потому что вы "помните", что вопрос уже был, а кто впервые сунулся, тем довольно сложно найти что-то ценное.
Вот специально прошерстил подфорум по моим вопросам, нашёл лишь один о туплах и пространные рассуждения о тонкостях сериализации в XML
Re[3]: вопросы новичка о языке
От: Blazkowicz Россия  
Дата: 23.09.11 10:11
Оценка:
Здравствуйте, баг, Вы писали:

баг>DataInputStream сериализует по-своему, ещё и в network byte order. Мне пришлось самому изобретать велосипед в сериализации, и не факт, что я, впервые сунувшись в мир явы, не допустил ошибок. В C# делал нечто подобное, но там под рукой были структуры, что сильно облегчало задачу, да и рефлекция там проще и одновременно мощнее, как мне показалось. Впрочем, это не холивар, а просто прояснение мнения.

Не понятно что именно вызывает затруднение. Скачать реализацию hessian под Java? В чем вопрос?

баг>Писать новый класс ради одного метода не хочется..

Во-первых проект не лопнет. Во-вторых "ради одного метода" это заблуждение. Значения каким-то образом оказались логически связаны. Вероятность того что они и в других местах проекта будет так же связаны стремится к единице.

B>> На худой конец можно и туплом с генериками.

баг>В стандартном хелпе не нашёл. http://javatuples.org ?
public class Tuple<K,V>{
   K k;
   V v;
}

Свойства и конструкторы добавить по надобности.


B>> Да. И воспользуйтесь, наконец, поиском. Каждый из этих вопросов уже обсуждали.

баг>Старожилам форума всегда так кажется, что и вопросы были, и ответы тоже, и поиск рулит. Но это только кажется, потому что вы "помните", что вопрос уже был, а кто впервые сунулся, тем довольно сложно найти что-то ценное.
Ищите лучше. Вот сходу:
http://rsdn.ru/forum/java/3868329.aspx
Автор: fegdri
Дата: 06.07.10

http://rsdn.ru/forum/java/377246.aspx
Автор: Und
Дата: 08.09.03

Про множественное наследование в других форумах (философия, архитектура) много полезной информации.

баг>Вот специально прошерстил подфорум по моим вопросам, нашёл лишь один о туплах и пространные рассуждения о тонкостях сериализации в XML

Вопрос про сериализацию я пока не понял. Просто перечислены факты. Вопрос в чем?
Re[3]: вопросы новичка о языке
От: Skipy Россия http://www.skipy.ru
Дата: 23.09.11 14:09
Оценка: 1 (1)
Здравствуйте, баг, Вы писали:

B>> Если объект возвращает пару значений, значит они логически связаны. Если они логически связаны, то почему они не являются полями одного объекта?

баг>Писать новый класс ради одного метода не хочется..

Если метод вычисляет логически связанные значения — это класс. Пусть и внутренний. Если метод вычисляет логически несвязанные значения — это нарушение Single Responsibility Principle, т.е. ошибка проектирования.
С уважением,
Евгений aka Skipy
www.skipy.ru
Re[4]: вопросы новичка о языке
От: баг  
Дата: 23.09.11 17:12
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Не понятно что именно вызывает затруднение. Скачать реализацию hessian под Java? В чем вопрос?

Спасибо за подсказку, это то что надо.

Правда, при виде директории io чуть инфаркт не хватил от такого эпического раздувания кода, но micro hessian именно то что надо в качестве работающего образца.
Re[2]: вопросы новичка о языке
От: баг  
Дата: 24.09.11 04:16
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

баг>>5. Беззнаковые типы


MOP>Их нет. Частично это компенсируется беззнаковым сдвигом, BigInteger, BitSet.

Вот, наткнулся: байтовое беззнаковое целое, обозначающее размер (до 256). Как его в яве прочесть как int с диапазоном 0..255?
Re[3]: вопросы новичка о языке
От: Blazkowicz Россия  
Дата: 24.09.11 07:15
Оценка:
Здравствуйте, баг, Вы писали:

баг>Вот, наткнулся: байтовое беззнаковое целое, обозначающее размер (до 256). Как его в яве прочесть как int с диапазоном 0..255?

если использовать int, то система, вероятно, станет резко тормозной?
Re[3]: вопросы новичка о языке
От: gegMOPO4  
Дата: 24.09.11 08:45
Оценка:
Здравствуйте, баг, Вы писали:

баг>Здравствуйте, gegMOPO4, Вы писали:

MOP>>Вот в C++ это плохой, ужасный способ. Проблемы с переносимостью — разные размеры, эндинг, представление, выравнивание. Которые могут изменяться даже в одном компиляторе при разных опциях. Проблема с безопасностью — сериализируются и дыры в структуре. Надёжный и безопасный способ — явная упаковка/распаковка в байты, в Java для этого используется DataInputStream или вручную.
баг>DataInputStream сериализует по-своему, ещё и в network byte order. Мне пришлось самому изобретать велосипед в сериализации, и не факт, что я, впервые сунувшись в мир явы, не допустил ошибок.

DataInputStream просто представляет готовые функции для составления из прочитанных из потока байтов целых разного размера. Не нравится network byte order (хотя именно он стандартен для сети), напишите свои функции, делов-то. Это и велосипедами-то назвать тяжело, настолько рутинно и очевидно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.