Есть ли альтернатива для перезаписи абстрактного метода в приведенном примере? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть вопрос о реализации этого примера здесь: https://dev.grakn.ai/docs/examples/phone-calls-migration-java. У нас есть абстрактный метод во вложенном абстрактном статическом классе:

public class PhoneCallsCSVMigration {
    /**
     * representation of Input object that links an input file to its own templating function,
     * which is used to map a Json object to a Graql query string
     */
    abstract static class Input {
        String path;

        public Input(String path) {
            this.path = path;
        }

        String getDataPath() {
            return path;
        }

        abstract String template(Json data);
    }
...

Позже, абстрактный методtemplate(Json data) отменяется с целью получения graqlInsertQuery:

inputs.add(new Input("files/phone-calls/data/companies") {
            @Override
            public String template(Json company) {
                return "insert $company isa company, has name " + company.at("name") + ";";
            }
        });

Прежде всего, как вообще возможно создать что-то типа Input? А во-вторых, откуда взялся Json company? Я хочу разделить класс PhoneCallsCSVMigration на несколько классов, таких как Input, GraknHandler, QueryHandler и т. Д., И мне интересно, как я могу определить шаблон для построения запроса вставки Graql, кроме переопределения абстрактногокласс. Любая помощь высоко ценится.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Прежде всего, как вообще возможно создать экземпляр типа Input?

Вы не создаете экземпляр класса Input. Вы создаете экземпляр анонимного класса, который наследуется от Input и реализует его абстрактный метод template.

, откуда берется Json company?

Он исходит от того, который вызовет метод template, передав его в качестве параметра.

Остальную часть вопроса я оставляю кому-то, кто это понял ...

0 голосов
/ 04 ноября 2019

Очевидно, что дочерний элемент Input создается с path и реализующим шаблоном. Вероятно, этот объект передается окружающему классу и вызывает template, передавая Json данные.

Абстрактный метод можно так же легко заменить на Function<Json, String>, но тогда эта функция пропустит path, так что можно использовать BiFunction<String, Json, String>.

Вы должны посмотреть, откуда и когда пришел путь и Json. Здесь это кажется немного искусственным. Вместо статического внутреннего класса, как указано выше, традиционным (очень похожим) шаблоном будет:

abstract class A {
    public final void func() { // Some service offered by this class.
        B b = ...;
        C c = onFunc(b);
    }

    abstract protected C onFunc(B b); // Some requirement to implement.
}
  • Здесь func для пользователей службы A.
  • И onFunc предназначен для того, чтобы разработчики A выполняли определенное требование.

Так что из контекста, как в вашем случае, это немного странно или слишком сложно. Казалось бы, просто передать функцию обратного вызова.

...