Как получить скрипт Google Web App, который открывает лист для запуска дополнительного скрипта на листе

Короткий ответ: это вполне возможно, но Java этого не делает.

Вот какой код, который иллюстрирует текущее состояние дел дел в Java:

Файл Base.java:

package sp.trial;
public class Base {
  static void printValue() {
    System.out.println("  Called static Base method.");
  }
  void nonStatPrintValue() {
    System.out.println("  Called non-static Base method.");
  }
  void nonLocalIndirectStatMethod() {
    System.out.println("  Non-static calls overridden(?) static:");
    System.out.print("  ");
    this.printValue();
  }
}

Файл Child.java:

package sp.trial;
public class Child extends Base {
  static void printValue() {
    System.out.println("  Called static Child method.");
  }
  void nonStatPrintValue() {
    System.out.println("  Called non-static Child method.");
  }
  void localIndirectStatMethod() {
    System.out.println("  Non-static calls own static:");
    System.out.print("  ");
    printValue();
  }
  public static void main(String[] args) {
    System.out.println("Object: static type Base; runtime type Child:");
    Base base = new Child();
    base.printValue();
    base.nonStatPrintValue();
    System.out.println("Object: static type Child; runtime type Child:");
    Child child = new Child();
    child.printValue();
    child.nonStatPrintValue();
    System.out.println("Class: Child static call:");
    Child.printValue();
    System.out.println("Class: Base static call:");
    Base.printValue();
    System.out.println("Object: static/runtime type Child -- call static from non-static method of Child:");
    child.localIndirectStatMethod();
    System.out.println("Object: static/runtime type Child -- call static from non-static method of Base:");
    child.nonLocalIndirectStatMethod();
  }
}

Если вы запустите это (я сделал это на Mac, от Eclipse , используя Java 1.6), вы получаете:

Object: static type Base; runtime type Child.
  Called static Base method.
  Called non-static Child method.
Object: static type Child; runtime type Child.
  Called static Child method.
  Called non-static Child method.
Class: Child static call.
  Called static Child method.
Class: Base static call.
  Called static Base method.
Object: static/runtime type Child -- call static from non-static method of Child.
  Non-static calls own static.
    Called static Child method.
Object: static/runtime type Child -- call static from non-static method of Base.
  Non-static calls overridden(?) static.
    Called static Base method.

Здесь случаи only , которые могут быть сюрпризом (и о котором идет речь), выглядят как первый случай :

«Тип времени выполнения не используется для определения того, какие статические методы вызывают, даже если вызывается с экземпляром объекта (obj.staticMethod())».

и последний случай last :

«При вызове статического метода из объектного метода класса выбранный статический метод является единственным, доступным из самого класса, и не из класса, определяющего тип времени выполнения объекта. "

Вызов с экземпляром объекта

Статический вызов разрешен во время компиляции, тогда как вызов нестатического метода разрешен во время выполнения. Обратите внимание, что хотя статические методы унаследованы (от родителя), они не переопределены (дочерним). Это может быть неожиданностью, если вы ожидали иначе.

Вызов из метода объекта

Вызов метода [) разрешается с использованием типа времени выполнения, но статические вызовы метода class разрешаются с использованием типа времени компиляции (объявленного).

Изменение правил

Чтобы изменить эти правила, последний вызов в примере с именем Child.printValue(), статические вызовы должны были быть снабжены типом во время выполнения, а не компилятором, разрешающим вызов во время компиляции с объявленным классом объекта (или контекста). Статические вызовы затем могут использовать иерархию (динамического) типа для разрешения вызова, так же, как и вызовы метода объекта.

Это легко выполнимо (если мы изменили Java: -O) и не на все это необоснованно, однако у него есть некоторые интересные соображения.

Основное соображение состоит в том, что нам нужно решить , что вызовы статического метода должны сделать это.

At момент, Java имеет этот «quirk» на языке, на котором вызовы obj.staticMethod() заменяются вызовами ObjectClass.staticMethod() (обычно с предупреждением). [ Примечание: ObjectClass является типом времени компиляции obj.] Это были бы хорошие кандидаты для переопределения таким образом, принимая тип времени выполнения obj.

Если бы мы это сделали, это затрудняло бы считывание методов: статические вызовы в родительском классе потенциально могли бы быть динамически «перенаправлены». Чтобы избежать этого, нам пришлось бы вызвать статический метод с именем класса - и это делает вызовы более понятными с иерархией типов времени компиляции (как сейчас).

Другие способы вызова статический метод более сложный: this.staticMethod() должен означать то же, что и obj.staticMethod(), принимая тип времени выполнения this. Однако это может привести к некоторым головным болям с существующими программами, которые вызывают (видимо, локальные) статические методы без декорации (что, возможно, эквивалентно this.method()).

Так что насчет неуправляемых вызовов staticMethod()? Я предлагаю им сделать то же самое, что и сегодня, и использовать контекст локального класса, чтобы решить, что делать. В противном случае возникла бы большая путаница. Конечно, это означает, что method() будет означать this.method(), если method был нестационарным методом, а ThisClass.method(), если method был статическим методом. Это еще один источник путаницы.

Другие соображения

Если мы изменили это поведение (и сделало статические вызовы потенциально динамически нелокальными), мы, вероятно, захотели бы пересмотреть смысл final, private и protected в качестве квалификаторов в static методах класса. Мы тогда должны были привыкнуть к тому, что методы private static и public final не переопределены и поэтому могут быть безопасно разрешены во время компиляции и «безопасны» для чтения в качестве локальных ссылок.

0
задан Rubén 19 January 2019 в 06:33
поделиться