Геттеры / сеттеры в Java - PullRequest
22 голосов
/ 17 мая 2009

Я новичок в Java, но имею некоторый опыт работы с ООП с 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;
    }

}

Есть ли в Java эквивалентный метод получения / установки ActionScript 3, как в доступ к закрытому полю в качестве поля из экземпляра класса, но наличие метода для реализации этого внутри класса?

Ответы [ 7 ]

20 голосов
/ 17 мая 2009

Неа. AS3 геттеры и сеттеры - вещь ECMAScript. В Java вы застряли в функциях стиля getVal () и setVal () - нет никакого синтаксического сахара, который облегчит вам задачу.

Я думаю, что Eclipse может помочь автоматически генерировать подобные вещи ...

10 голосов
/ 17 мая 2009

Ваш Java-код в порядке, за исключением того, что вы хотите сделать _name приватным .

В Java нет get и set ключевых слов, как в вашем примере 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 голосов
/ 03 января 2010

Независимым от IDE способом является использование Lombok , библиотеки на основе аннотаций, которая генерирует геттеры, сеттеры и даже equals() и hashcode(). Он делает это для компилятора, но не в исходном файле, поэтому вам не нужно смотреть на методы, просто используйте их.

3 голосов
/ 17 мая 2009

Я бы посоветовал не иметь геттера или сеттера, поскольку в вашем случае они ничего не делают, кроме как усложняют код. Вот пример без геттеров и сеттеров.

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

3 голосов
/ 17 мая 2009

К сожалению, нет, в Java нет эквивалентной поддержки на уровне языка.

Шаблоны get * и set * настолько укоренились в Java-культуре, что вы найдете сильную поддержку IDE для них (например, eclipse сделает их для вас автоматически), и если вы работаете над чем-то, что использует Язык выражений сначала создан для jsps (EL), затем вы сможете использовать нотацию свойств для доступа к получателям и установщикам.

2 голосов
/ 17 мая 2009

В Java единственный вариант, который у вас есть, не раскрывая внутренности вашего объекта, - это создавать свои собственные методы получения и установки, как в вашем примере.

Условием является добавление get или set перед изменяемым полем. Таким образом, как в вашем примере, поле name будет иметь методы getName и setName в качестве соответствующих методов их получения и установки, соответственно.

1 голос
/ 18 мая 2009

Также, прежде чем добавлять сеттеры и геттеры, было бы неплохо спросить себя, почему вы выставляете внутренние данные рассматриваемого объекта.
Я предлагаю вам прочитать эту статью - http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

...