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