Getters/seters в Java
Я новичок в Java, но имею опыт работы с OOP с ActionScript 3, поэтому я пытаюсь выполнить миграцию, полагаясь на то, что я знаю.
В ActionScript 3 вы можете создавать геттеры и сеттеры, используя ключевые слова get и set, что означает, что вы создаете метод в классе и получаете доступ к данным через свойство экземпляра этого класса. Я мог бы казаться сложным, но это не так. Вот пример:
class Dummy{
private var _name:String;
public function Dummy(name:String=null){
this._name = name;
}
//getter
public function get name():String{
return _name;
}
//setter
public function set name(value:String):void{
//do some validation if necessary
_name = value;
}
}
И я бы получил доступ к name
в объекте как:
var dummy:Dummy = new Dummy("fred");
trace(dummy.name);//prints: fred
dummy.name = "lolo";//setter
trace(dummy.name);//getter
Как я могу сделать это на Java?
Просто, если в некоторых общественных местах не может быть и речи.
Я заметил, что существует такое соглашение об использовании get и set перед методами, с которыми я в порядке.
Например,
class Dummy{
String _name;
public void Dummy(){}
public void Dummy(String name){
_name = name;
}
public String getName(){
return _name;
}
public void setName(String name){
_name = name;
}
}
Есть ли эквивалент ActionScript 3 getter/seters в Java, как в
доступ к частному полю в качестве поля из экземпляра класса, но имеющий способ реализации этого внутри класса?
Ответы
Ответ 1
Неа. AS3-приемники и сеттеры - это средство ECMAScript. В Java вы застряли в функциях стиля getVal() и setVal() - нет никакого синтаксического сахара, чтобы облегчить вам задачу.
Я думаю, что Eclipse может помочь автоматически генерировать эти типы вещей, хотя...
Ответ 2
Ваш Java-код в порядке, за исключением того, что вы хотели бы сделать _name
private.
В Java нет get и заданных ключевых слов, как в примере AS3. Извините, это не улучшается, чем вы уже делаете.
Исправленный код:
class Dummy {
private String _name;
public void Dummy() {}
public void Dummy(String name) {
setName(name);
}
public String getName() {
return _name;
}
public void setName(String value) {
_name = value;
}
}
Ответ 3
К сожалению, нет, в java нет поддержки на уровне языка.
Шаблоны get * и set *, хотя и установлены в java-культуре, вы найдете для них сильную поддержку IDE (например, eclipse сделает их для вас автоматически), и если вы работаете над тем, что использует язык выражения, впервые сделанный для jsps (EL), тогда вы сможете использовать нотацию свойств для доступа к получателям и сеттерам.
Ответ 4
Я бы подумал, что у вас нет геттера или сеттера, поскольку они ничего не делают в вашем случае, кроме того, что сделать код более сложным. Вот пример без геттеров или сеттеров.
class Dummy {
public String name;
public Dummy(String name) { this.name = name; }
}
Dummy dummy = new Dummy("fred");
System.out.println(dummy.name);//getter, prints: fred
dummy.name = "lolo";//setter
System.out.println(dummy.name);//getter, prints: lolo
ИМХО Не делайте вещи более сложными, чем вам нужно. Это часто случается с тем, что сложность добавления будет You-Aint-Gonna-Need-It
Ответ 5
Независимым от IDE способом является использование Lombok, библиотека на основе аннотаций, которая генерирует геттеры, сеттеры и даже equals()
и hashcode()
. Он делает это для компилятора, но не в исходном файле, поэтому вам не нужно смотреть на методы, просто используйте их.
Ответ 6
В Java единственный вариант, который у вас есть, не подвергая внутренности вашего объекта, заключается в том, чтобы создавать собственные геттеры и сеттеры, как у вас в вашем примере.
Соглашение заключается в том, что перед тем, как изменится поле, добавьте get
или set
. Итак, как и в вашем примере, поле name
будет иметь методы getName
и setName
в качестве их соответствующих геттеров и сеттеров соответственно.
Ответ 7
Также перед добавлением сеттеров и геттеров может возникнуть проблема спросить себя, почему вы раскрываете внутренние данные рассматриваемого объекта.
Я предлагаю вам прочитать эту статью -
http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html