Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137

Пустые методы в перечислении java.util.concurrent.TimeUnit

15.01.2017, 12:30. Показов 1527. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил, ради интереса, посмотреть, как реализованы методы convert(), toNanos(), toSeconds() и прочие в перечислении TimeUnit, но, к своему удивлению, обнаружил у всех подобных методов следующее:
Java
1
2
3
4
5
6
7
public long toMicros(long duration) {
        throw new AbstractMethodError();
    }
 
  public long convert(long sourceDuration, TimeUnit sourceUnit) {
        throw new AbstractMethodError();
    }
И всё! А где реализация? Почему написано, что они просто бросают исключение?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.01.2017, 12:30
Ответы с готовыми решениями:

Java.util.concurrent.* или java.util.Stream
Как добавить библиотеку java.util.concurrent или java.util.Stream? Прошу, пожалуйста, помочь. import java.util.concurrent.locks.*; ...

Разработать многопоточное приложение. Использовать возможности, предоставляемые пакетом java.util.concurrent
Разработать многопоточное приложение. Использовать возможности, предоставляемые пакетом java.util.concurrent. Не использовать слово...

Методы интерфейса java.util.List
Создать тестовый пример, демонстрирующий работу всех методов интерфейса java.util.List. В качестве коллекций, реализующих данный интерфейс...

24
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
15.01.2017, 13:05
Цитата Сообщение от danek130995 Посмотреть сообщение
Решил, ради интереса, посмотреть, как реализованы методы convert(), toNanos(), toSeconds() и прочие в перечислении TimeUnit
раз уж вы ради интереса что-то начали смотреть, ради того же интереса можете поискать почему так (хотя бы почитать комментарии в классе)

// To maintain full signature compatibility with 1.5, and to improve the
// clarity of the generated javadoc (see 6287639: Abstract methods in
// enum classes should not be listed as abstract), method convert
// etc. are not declared abstract but otherwise act as abstract methods.
http://bugs.java.com/bugdataba... id=6287639

Цитата Сообщение от danek130995 Посмотреть сообщение
А где реализация?
опять же. Если уже смотрите что-то, уделите этому ещё 5 мин и хотя бы просмотрите весь класс.
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
15.01.2017, 15:17  [ТС]
KEKCoGEN, спасибо большое за Ваш ответ, я, кажется, понял: компилятор java требует, чтобы в перечислениях все методы были с конкретными реализациями(
since javac ensures that each enum constant provides a concrete implementation of the method
), но так как хочется обозначить единое поведение для нескольких констант, то объявляют неабстрактный метод, который играет роль абстрактного, а потом уже в каждой конкретной константе перечисления этот метод переопределяется. Правильно?
Но Почему тогда я ниже в классе заметил метод:
Java
1
2
3
4
5
6
7
8
/**
     * Utility to compute the excess-nanosecond argument to wait,
     * sleep, join.
     * @param d the duration
     * @param m the number of milliseconds
     * @return the number of nanoseconds
     */
    abstract int excessNanos(long d, long m);
он объявлен как абстрактный! Почему так? Ведь это запрещено в enum. Или я не так понял что-то?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
15.01.2017, 20:13
danek130995, каждый член enum-а реализует этот метод.
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
15.01.2017, 20:42  [ТС]
turbanoff, метод toDays(), например, тоже реализуется каждым членом enum-а. Почему тогда он не объявлен абстрактным?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
16.01.2017, 00:10
danek130995, так решили авторы JDK, чтобы javadoc сгенерировался без указания abstract
1
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
16.01.2017, 10:23
Цитата Сообщение от turbanoff Посмотреть сообщение
так решили авторы JDK, чтобы javadoc сгенерировался без указания abstract
почти...баг был открыт из-за того что стандартный доклет не выписывает в доки абстрактные методы поэтому когда генерировался док для этого класса, абстрактные методы туда не попадали. Это пофиксили таким вот немного костыльным образом.
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
16.01.2017, 16:14  [ТС]
KEKCoGEN, turbanoff, не понял.. Объясните пожалуйста заново.
Сначала я подумал, что так как компилятор java требует, чтобы в перечислениях все методы были с конкретными реализациями, но так как хочется обозначить единое поведение для нескольких констант, то объявляют неабстрактный метод, который играет роль абстрактного, а потом уже в каждой конкретной константе перечисления этот метод переопределяется.
Но потом я ниже в классе заметил метод, который объявлен абстрактным. turbanoff сказал, что это допустимо, так как каждый член перечисления реализует данный метод. Но ведь все остальные методы тоже реализуются всеми членами.
KEKCoGEN, Ваш последний ответ не понял вообще. Вы говорите, "что абстрактные методы туда не попадали, стандартный доклет(что такое доклет?) не выписывает в доки абстрактные методы". Так ведь полно доков с абстрактными методами? "Это пофиксили таким вот немного костыльным образом." Что пофиксили?
Я запутался.. помогите
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
16.01.2017, 16:54
danek130995, мне честно лень писать подробное описание. Есть баг. Есть гугл. Если вам очень интерестно, поищите сами однако я бы на вашем месте забил. Не такой уж интерестный кейс особенно с вашем уровнем знаний. У вас должно хватать тем для изучения и без этого.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
16.01.2017, 19:35
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
почти...баг был открыт из-за того что стандартный доклет не выписывает в доки абстрактные методы поэтому когда генерировался док для этого класса, абстрактные методы туда не попадали.
Откуда вы это взяли?
Перечитал текст бага. Баг заведён на то чтобы убрать слово abstract из javadoc-а метода, так как оно misleading для enum-а.
0
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
16.01.2017, 19:37  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
убрать слово abstract
turbanoff, однако же слово abstract остается для одного метода, и даже не смотря на то, что все члены enum его реализуют
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
16.01.2017, 19:41
Цитата Сообщение от danek130995 Посмотреть сообщение
однако же слово abstract остается для одного метода
Да он не public - его не будет в javadoc.
1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
16.01.2017, 19:49  [ТС]
turbanoff, ясно
Но все же остается непонятным, почему нельзя было все эти методы объявить абстрактными по нормальному? Ведь каждый из них реализуется в каждом члене Enum'а.
Сейчас попробовал создать такой Enum:
Java
1
2
3
4
5
6
7
8
9
10
11
public enum Enum {
    BAZINGA1 {
        @Override
        void method() {
 
        }
    };
 
    abstract void method();
   
}
Конструкция вполне допустима.
Понятно было бы, если бы какой-то из членов TimeUnit не реализовывал бы какой-то метод. Но ведь все реализуются, зачем этот workaround нужен был?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
16.01.2017, 19:54
danek130995, Я же написал: чтобы метод не был помечен как abstract в javadoc-е для enum-а.
Попробуйте сгенерировать javadoc для вашего enum. И всё увидите.
0
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
16.01.2017, 20:11  [ТС]
turbanoff, а почему в javadoc'е нельзя помечать методы абстрактными?
И что имелось в виду To maintain full signature compatibility with 1.5? В java 1.5 что то было запрещено?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
16.01.2017, 20:16
danek130995, Потому что enum всё равно обязатывает иметь имплементацию всех методов.
Это бы смущало пользователей, которые читают javadoc.
То как именно реализован метод (один на весь enum или в каждом поле свой) - это детали реализации, они не должны быть видны в спеке языка.

Добавлено через 1 минуту

Не по теме:

PS. Вот же вам нечем заняться чем обсуждать такие неважные детали на форуме :D

1
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
16.01.2017, 21:41  [ТС]
turbanoff, на самом деле я очень занятой, и вопросы на Форуме задаю такие, потому что хочу отлично знать java и у меня пытливым ум. Вы говорите, что это смущало бы пользователей) "неплохо" они позаботились о пользователях! Получилось как раз наоборот, потому что люди с пытливым умом смутятся ещё больше - Я вот смутился же)
А что все таки на счёт 1.5? Какая несовместимость имелась в виду?
0
16.01.2017, 21:44

Не по теме:

гуглом научись пользоваться, ядрен батон

0
 Аватар для danek130995
33 / 33 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
16.01.2017, 22:09  [ТС]
xoraxax, я умею, спасибо) я хочу просто у профессионалов спросить и я точно не знаю какой запрос даже вбить в данной ситуации
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
16.01.2017, 23:42
Цитата Сообщение от turbanoff Посмотреть сообщение
Откуда вы это взяли?
там в related есть баг 5035528. Можно сгенерировать доки и посмотреть что будет, но мне лень)

Добавлено через 2 минуты
Цитата Сообщение от danek130995 Посмотреть сообщение
на Форуме задаю такие, потому что хочу отлично знать java
это те тот путь, который приведет вас к отличному знанию джава.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.01.2017, 23:42
Помогаю со студенческими работами здесь

Аналоги java.util.ArrayList<java.util.ArrayList<Integer>>
Подскажите, пожалуйста, аналоги java.util.ArrayList&lt;java.util.ArrayList&lt;Integer&gt;&gt;, которые 1. либо работают быстрее 2. либо потребляют...

java.util.NoSuchElementException
import java.util.*; import java.io.*; public class D246 { public static void main(String args) throws IOException{

Java.util.Scanner
Как я могу читать ввод из консола (цифры) с помощью java.util.Scanner когда числа разделены любым количеством пробелов и разрывов строк?

java.util.ConcurrentModificationException
Exception in thread &quot;AWT-EventQueue-0&quot; java.util.ConcurrentModificationException Вылетает ошибка просто на рандомном элементе, почему и...

Пакет Java.util
Привет всем! Помогите пожалуйста в выполнении задания! Я совсем ничего не понимаю :wall: Нужно создать коллекцию List, которая будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru