powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Self-implemented(?) интерфейс, или как такое вообще может работать ?
11 сообщений из 11, страница 1 из 1
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38376812
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hi.

Почему допускается вот такой форменный изврат ?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
import java.math.BigInteger;
import java.util.Random;

class PrimableTest {
  public static void main(String[] args) {        
    System.out.println(  Primable.PRIME_RANDOM.generateRandomPrime(8) );
  }

  // "self-implemented" interface ?
  interface Primable {
    BigInteger generateRandomPrime(int bitLen);
    Primable PRIME_RANDOM = new Primable() {
      @Override
      public BigInteger generateRandomPrime(int bitLen) {
        return BigInteger.probablePrime(bitLen, new Random());
      }
    };
  }
}

Test:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
java PrimableTest
197

java PrimableTest
149

java PrimableTest
223

В списке полей есть вот это:
Код: java
1.
Primable PRIME_RANDOM = ...

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

ЗЫ. В доке ничего про это не объяснено:
Interfaces in Java

In the Java programming language, an interface is a reference type, similar to a class, that can contain only constants, method signatures, and nested types . There are no method bodies. Interfaces cannot be instantiated—they can only be implemented by classes or extended by other interfaces.* nested types - это про вложенные интерфейсы, я правильно понимаю ?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
interface Grand {
  interface Middle {
    interface  Small {
       interface  Tiny {
       }
    }
  }
}
...
Рейтинг: 0 / 0
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38376853
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это возможность предоставления какой-то реализации(ли нескольких) пользователями кода.
Например
Имеется следующий незамысловатый интерфейс.
Код: java
1.
2.
3.
interface Options {
	void applyTo(Object o);
}


И хочется к нему задать какое-то значение, которое на самом деле ничего не делает, но оно нужно т.к. мы знаем, что передать null это очень и очень плохо.

Какие у нас есть варианты решения этой проблемы?
1) Можно не париться и пусть пользователи сами создают такую реализацию каждый раз.
2) Создать новый файлик и в нем написать код
Код: java
1.
2.
3.
4.
final class None implements Options {
	@Override
	public void applyTo(Object o) {}
}


Уже конечно лучше, но все таки что-то не так...
3) Т.к. у нас есть возможность задать константу в интерфейсе
Код: java
1.
2.
3.
4.
5.
6.
7.
interface Options {
	Options NONE = new Options(){
		@Override
		public void applyTo(Object o) {}
	};
	void applyTo(Object o);
}
...
Рейтинг: 0 / 0
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38377015
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schwaЭто возможность предоставления какой-то реализации(ли нескольких) пользователями кода. Есть ли хоть один пример в офиц. доке, показывающий этот выверт и разъясняющий его суть ? Или в заумных талмудах вроде Хорстмана или Эккеля или Хабибуллина ? Я не нашел.

ПОЛУОФФ. Глупый вопрос задам, наверное, но всё же.
Вот не понимаю в упор, почему компилятор не спотыкается об это:
Код: java
1.
2.
3.
4.
5.
6.
7.
1. interface MyAble {
2.   MyAble ABLE = new MyAble() {};
3. }
4. class MyList {
5.   MyList t;
6.   // ...
7. }

Когда процесс компиляции дойдет до строки 2, то увидит там константу того типа, который сейчас еще разбирается (компилируется). Аналогично для строки 5 (хотя этот случай, конечно, весьма часто встречается).
Как он "соображает", что поле компилируемого в данный момент класса может ссылаться на этот класс, когда он еще "недокомпилировался" ?
...
Рейтинг: 0 / 0
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38377065
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis, наверное ты еще очень молод и не изучал рекуррентные формулы,
рекурсивные функции, грамматкики и функции которые описывают бесконечные
последовательности. Так что всё еще у тебя впереди

Кстати на уровне JVM все объекты - суть objectrefs.
...
Рейтинг: 0 / 0
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38377085
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis- как по-русски сформулировать, что это на самом деле ? "Константа, начальное значение которой задается созданием безымянного объекта, реализующего этот же интерфейс..." - ну бред же...
анонимный класс , ну или безымянный.
Если его (класс) более нигде создавать не планируют, то можно и не именовать.
...
Рейтинг: 0 / 0
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38377099
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonozzmosis, наверное ты еще очень молод и не изучал рекуррентные формулы, рекурсивные функцииуже не молод, к сож-ю, но учиться же никогда не поздно :-) тем более, когда язык нравится.
Но ты мне попроще, по-пролетарски, можешь сказать: каким боком компилятор применяет эти "рекуррентные формулы" в том маленьком фрагменте, который выше приведен ( 14753343 ) ? Ну, вот дошел он до строки 2 или 5, и... дальше что он делает ?
maytonКстати на уровне JVM все объекты - суть objectrefs.т.е. ссылки на объекты, находящиеся в heap'e ? но что из этого следует и как это связано с вопросом о компиляции ?
...
Рейтинг: 0 / 0
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38377103
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев анонимный класс , ну или безымянный.Дык я понимаю, что это он самый, анонимный класс, который можно не именовать.

Не понимаю одной детальки, она в ступор вводит.
Имя компилируемого интерфейса (или класса) начинает использоваться уже в нём самом. Как это ? Вон, в математике: факториал хоть и рекурсивно определяется, но "якорная" точка и у него есть: 0! = 1.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  // "self-implemented" interface ?
  interface Primable {
  //             ^--(1)
    BigInteger generateRandomPrime(int bitLen);
    Primable PRIME_RANDOM = new Primable() {
    //                              ^--(2)
      @Override
      public BigInteger generateRandomPrime(int bitLen) {
        return BigInteger.probablePrime(bitLen, new Random());
      }
    };
  }
...
Рейтинг: 0 / 0
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38377147
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisИмя компилируемого интерфейса (или класса) начинает использоваться уже в нём самом.
Какие сложности то.

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

Вон в более навернутых языках, типа javascript, там все еще серьезнее - описание "класса", в том числе цепочка прототипов, может меняться на лету.
...
Рейтинг: 0 / 0
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38377179
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisschwaЭто возможность предоставления какой-то реализации(ли нескольких) пользователями кода. Есть ли хоть один пример в офиц. доке, показывающий этот выверт и разъясняющий его суть ? Или в заумных талмудах вроде Хорстмана или Эккеля или Хабибуллина ? Я не нашел.

Enum также реализован.
...
Рейтинг: 0 / 0
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38377429
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisИмя компилируемого интерфейса (или класса) начинает использоваться уже в нём самом.

Ну и что? И с рекурсивными функциями так же.

И более того, можно использовать имена классов и методов, которые вообще даже еще не встречались.

Сначала компилятор делает синтакический разбор, и ему достаточно определить категорию имени, которую он встретил - класс, метод, переменная. Это он определяет по характеру использования, а не в результате накопленных описаний. Далее, когда весь исходный файл разобран, следующий проход просматривает результирующее дерево разбора и проверяет правильность использования имен - все имена должны быть описаны, быть соответствующего использованию типа и т.п. И только потом происходит генерация кода.
...
Рейтинг: 0 / 0
Self-implemented(?) интерфейс, или как такое вообще может работать ?
    #38377460
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rfqкогда весь исходный файл разобран, следующий проход просматривает результирующее дерево разбора и проверяет правильность использования имен А, вот оно что. Ясно, спасибо.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Self-implemented(?) интерфейс, или как такое вообще может работать ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]