Что такое Java-эквивалент свойства Python ()? - PullRequest
9 голосов
/ 13 января 2010

Я новичок в Java, и я хотел бы создать некоторые переменные класса, которые динамически вычисляются при доступе, как вы можете сделать в Python с помощью метода property (). Тем не менее, я не совсем уверен, как это описать, поэтому Googling много показывает мне о классе «Property» Java, но, похоже, это не то же самое. Что такое Java-эквивалент свойства Python ()?

Ответы [ 6 ]

7 голосов
/ 13 января 2010

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

Например:

class Point{
  private int x, y;

  public Point(int x, int y){
    this.x = x;
    this.y = y;
  }

  public void setX(int x){
    this.x = x;
  }

  public int getX(){
    return x;
  }

  public void setY(int y){
    this.y = y;
  }

  public int getY(){
    return y;
  }
}
<Ч />

Возможно, вы захотите взглянуть на Project Lombok , который предоставляет аннотации @Getter и @Setter, которые в некоторой степени похожи на property.

Python.

При использовании Lombok приведенный выше пример сокращается до:

class Point{
  @Getter @Setter private int x, y;

  public Point(int x, int y){
    this.x = x;
    this.y = y;
  }
}
3 голосов
/ 13 января 2010

встроенная функция property () делает прямо противоположное тому, что описано здесь в ответах. речь идет не о генерации геттеров и сеттеров для переменных-членов. он просто позволяет вам вызывать метод путем доступа к свойству (поэтому, хотя вы просто обращаетесь к переменной в классе Python, вызывается функция) ( этот пост объясняет, как и зачем его использовать.)
При этом Java не предлагает ничего подобного. Более того, доступ к собственности в Java не рекомендуется. Я думаю, вы могли бы сделать это на языке сценариев Groovy и мета-магии, хотя. но я не знаю из головы, как это сделать.

2 голосов
/ 13 января 2010

Они на самом деле не существуют. В Java принято объявлять члены как private или protected и разрешать доступ к ним только через методы. Часто это приводит к множеству небольших getFoo() и setFoo(newFoo) методов. Python на самом деле не имеет private и protected, и чаще разрешается прямой доступ к членам.

1 голос
/ 13 января 2010

Как уже отмечалось, у java есть геттеры и сеттеры, но строгого аналога нет. Существует сторонняя библиотека с именем Project Lombok , которая использует аннотации для генерации методов получения и установки в файлах .class во время компиляции. Это можно использовать, чтобы сделать вещи немного менее многословными.

0 голосов
/ 13 января 2010

На самом деле вы можете смоделировать это поведение в Java.

ВНИМАНИЕ: некрасивое решение ниже

Вы можете написать метод в служебном классе, как показано ниже:

public Object getProperty(String property, Object obj) {
  if (obj != null && property != null) {
       Field field = obj.getClass().getDeclaredField(property);
       field.setAccessible(true);
       try {
          return field.get(obj);
       } catch (Exception ex) {
          return null;
       }
  }
  return null;
}

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

Кстати, Groovy поддерживает эту функцию.

0 голосов
/ 13 января 2010

Хотите создать новые поля / получатели / сеттеры в классе? Если вы хотите сделать это во время выполнения, вы должны создать совершенно новый класс с вашими полями и методами и загрузить его в JVM. Для создания нового класса вы можете использовать такие библиотеки, как ASM или CGLib, но если вы новичок в Java, вам не стоит начинать с этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...