Теперь, когды вы знаете, что такое пакеты, мы можем обратиться к различным модификаторам доступа, содержащимся в языке программирования JavaFX Script. Это особые зарезервированные слова, которые позволяют устанавливать различные области действия ваших переменных, функций и классов. |
Содержание
Доступ по умолчанию, также известный как "доступ только из текущего скрипта", это то, что вы получаете, когда не указан никакой модификатор доступа. Именно его мы использовали в предыдущих уроках.
Вот некоторые примеры:
var x;
var x : String;
var x = z + 22;
var x = bind f(q);
|
При таком уровне доступа переменные можно инициализировать, переопределять, читать, присваивать или связывать только внутри текущего скрипта. Никакие другие исходные файлы не имеют доступа к этой информации.
Чтобы сделать переменную, функцию или класс доступными для остального кода внутри пакета, используйте модификатор доступа package :
Не путайте модификаторы доступа с объявлениями пакета, описанными в предыдущем уроке!
Пример:
// Inside file tutorial/one.fx
package tutorial; // places this script in the "tutorial" package
package var message = "Hello from one.fx!"; // this is the "package" access modifier
package function printMessage() {
println("{message} (in function printMessage)");
}
// Inside file tutorial/two.fx
package tutorial;
println(one.message);
one.printMessage();
|
Вы можете скомпилировать и выполнить этот пример (из директории tutorial ) с помощью следующих команд:
javafxc tutorial/one.fx tutorial/two.fx
javafx tutorial/two
|
Результат:
Hello from one.fx!
Hello from one.fx! (in function printMessage)
|
Модификатор доступа protected делает переменную или функцию доступной для остального кода внутри пакета и для подклассов, содержащихся в любом пакете.
Пример:
// Inside file tutorial/one.fx
package tutorial;
public class one {
protected var message = "Hello!";
}
// Inside file two.fx
import tutorial.one;
class two extends one {
function printMessage() {
println("Class two says {message}");
}
};
var t = two{};
t.printMessage();
|
Скомпилируйте и запустите следующую демонстрационную программу:
javafxc tutorial/one.fx two.fx
javafx two
|
Результат будет следующим:
Примечание: данный модификатор доступа не может применяться к классам, поэтому для класса one мы использовали модификатор public .
Класс, переменная или функция с доступом public обладают наибольшей областью действия. Доступ к ним открыт из любого класса или скрипта, находящихся внутри любого пакета.
Пример:
// Inside file tutorial/one.fx
package tutorial;
public def someMessage = "This is a public script variable, in one.fx";
public class one {
public var message = "Hello from class one!";
public function printMessage() {
println("{message} (in function printMessage)");
}
}
// Inside file two.fx
import tutorial.one;
println(one.someMessage);
var o = one{};
println(o.message);
o.printMessage();
|
Скомпилируйте и выполните следующий пример:
javafxc tutorial/one.fx two.fx
javafx two
|
Результат:
This is a public script variable, in one.fx
Hello from class one!
Hello from class one! (in function printMessage)
|
Модификатор доступа public-read оперделяет переменную, которая доступна для чтения отовсюду, но для записи (по умолчанию) доступна только из текущего скрипта. Чтобы расширить доступ для записи переменной, добавьте вначале модификатор package или protected (т.е. package public-read или protected public-read ). Это позволит установить доступ к записи на уровень package или protected .
Пример:
// Inside file tutorial/one.fx
package tutorial;
public-read var x = 1;
// Inside tutorial/two.fx
package tutorial;
println(one.x);
|
Скомпилируйте и выполните следующий пример:
javafxc tutorial/one.fx tutorial/two.fx
javafx tutorial/two
|
Результатом будет "1", что говорит о том, что переменная x может быть прочитана извне скрипта tutorial/one.fx .
Теперь давайте попробуем изменить ее значение:
// Inside tutorial/two.fx
package tutorial;
one.x = 2;
println(one.x);
|
Результатом будет следующая ошибка компилятора:
tutorial/two.fx:3: x has script only (default) write access in tutorial.one
one.x = 2;
^
1 error
|
Чтобы исправить ошибку, мы должны расширить доступ к записи для x :
// Inside file tutorial/one.fx
package tutorial;
package public-read var x = 1;
// Inside tutorial/two.fx
package tutorial;
one.x = 2;
println(one.x);
|
Теперь пример будет скомпилирован, и на экран будет выведено "2".
Модификатор доступа public-init определяет переменную, которая может быть публично инициализирована объектной константой, содержащейся в любом пакете. Тем не менее, доступ к записи в этом случае контролируется тем же способом, что и у модификатора public-read (по умолчанию доступ к записи находится на уровне скрипта, но если добавить в начале модификатор package или protected, доступ будет расширен).
Значение этой переменной может быть считано из любого пакета.
Пример:
// Inside file tutorial/one.fx
package tutorial;
public class one {
public-init var message;
}
// Inside file two.fx
import tutorial.one;
var o = one {
message: "Initialized this variable from a different package!"
}
println(o.message);
|
Скомпилируйте и выполните следующий пример:
javafxc tutorial/one.fx two.fx
javafx two
|
Результатом будет сообщение "Initialized this variable from a different package! ", показывающее, что объектная константа, содержащаяся в другом пакете, может инициализировать переменную message . Тем не менее, поскольку доступ к записи находится на уровне скрипта, мы не можем изменить ее значение:
// Inside file two.fx
import tutorial.one;
var o = one {
message: "Initialized this variable from a different package!"
}
o.message = "Changing the message..."; // WON'T COMPILE
println(o.message);
|
Результатом будет следующая ошибка компилятора:
two.fx:12: message has script only (default) write access in tutorial.one
o.message = "Changing the message..."; // WON'T COMPILE
^
1 error
|
Это ожидаемый результат: переменная может быть инициализирована публично, но запись возможна только при другом уровне доступа.
|