Анонимные классы

Yoskaldyr

"Спамер"
Партнер клуба
Такой вопрос, а для чего кроме тестов можно заиспользовать анонимные классы?

У меня пока только идея для создания immutable версий каких либо классов без создания кучи однотипных файлов.

Может есть еще какое-то интересное применение для них?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
В сочетании с __invoke() можно делать более сложные (и вероятно, чуть более лучше написанные) кложуры, например, в том числе - с модификацией инплейс (new class(sth) extends SomeMiddleware { __invoke() {...} }

Такое может пригодится в демонах reactphp-based.
Вероятно, можно будет так писать в функциональном стиле, пайпая между invokable инстансами. Не знаю правда, зачем.
Но в целом, для такого не будет работать DI, и тд, в целом, очень-очень нишевая штука, кмк.
 

fixxxer

К.О.
Партнер клуба
Ну вот да, у меня типичное использование (кроме тестов) - это мидлварь для HttpClient (in-house обертка над Guzzle), типа такого

PHP:
$httpClient = $httpClientFactory->withMiddleware([
    new class() extends RetryMiddleware {
        protected function shouldRetryOnResponse(ResponseInterface $response): bool
        {
            return ....;
        }
    }
]);
 

Adelf

Administrator
Команда форума
Код PhpStorm буквально утыкан этими анонимными классами. Почти в каждом втором файле можно найти.
Просто в коде шторма нет нормального DI :) там игра немного по другим правилам. Надо пробежаться по файлам? вызываешь метод и прокидываешь туда слушатель. Котлин:
Java:
VfsUtil.processFilesRecursively(templateDir, object: Processor<VirtualFile> {
        override fun process(virtualFile: VirtualFile): Boolean {
            if(virtualFile.isDirectory) return true

            val filename: String = VfsUtil.getRelativePath(virtualFile, templateDir, '/') ?: return true

            if(filename.endsWith("tpl.php")) {
                completionResultSet.addElement(LookupElementBuilder.create(filename))
            }

            return true
        }
    })
Скорее всего, причина в том, что там в разных потоках это все может работать... я правда не оч понимаю как оно так легко переменные-замыкания юзает. Видимо все равно ждем результата и можно не париться насчет thread-safety. Т.е. с этими данными в одно время всегда работает один поток...
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Код PhpStorm буквально утыкан этими анонимными классами. Почти в каждом втором файле можно найти.
Просто в коде шторма нет нормального DI :) там игра немного по другим правилам. Надо пробежаться по файлам? вызываешь метод и прокидываешь туда слушатель. Котлин:
Java:
VfsUtil.processFilesRecursively(templateDir, object: Processor<VirtualFile> {
        override fun process(virtualFile: VirtualFile): Boolean {
            if(virtualFile.isDirectory) return true

            val filename: String = VfsUtil.getRelativePath(virtualFile, templateDir, '/') ?: return true

            if(filename.endsWith("tpl.php")) {
                completionResultSet.addElement(LookupElementBuilder.create(filename))
            }

            return true
        }
    })
Скорее всего, причина в том, что там в разных потоках это все может работать... я правда не оч понимаю как оно так легко переменные-замыкания юзает. Видимо все равно ждем результата и можно не париться насчет thread-safety. Т.е. с этими данными в одно время всегда работает один поток...
А разве это не потому что в жабе до версии 7 кложуры реализуются как раз через инвокэйбл анонимные классы?
 

Вурдалак

Продвинутый новичок
Анонимные классы могут быть способом описать какой-то inline-код, требущий зависимости:

PHP:
->setCode(
    new class {
        private $bus;

        public function __construct(CommandBus $bus) {
            $this->bus = $bus;
        }

        public function __invoke(...) {
            // ...
        }
    }
)
По сравнению с обычным замыканием, в котором либо придётся использовать зависимость внешнего контекста (а это не всегда желательно/возможно), либо лепить зависимости и входные параметры в одном списке параметров.

Но это очень спефический кейс и на любителя.
 
Сверху