(Нет) свойств в Java?
Я долгое время игнорировал Java и только недавно начал с ней работать, и мой первый опыт вызвал небольшой шок: в Java нет свойств в стиле C#!
Ладно, с этим можно смириться. Тем не менее, я клянусь, что видел код с геттерами и сеттерами для свойств в одном из проектов, но не могу вспомнить, где именно это было. Как это достигалось? Существует ли какое-то расширение языка для этого? Это связано с NetBeans или чем-то подобным?
5 ответ(ов)
Java Property Support действительно была предложена для Java 7, однако не была включена в язык. Это предложение касалось улучшения работы с настройками и свойствами в Java, что могло бы упростить работу разработчиков с конфигурацией приложений.
Несмотря на то, что эта особенность не попала в окончательную версию Java 7, информация о ней все еще доступна. Вы можете ознакомиться с дополнительными ссылками и информацией по этому вопросу на сайте, который вы упомянули: Pure Danger Java 7.
Если у вас есть дополнительные вопросы по этому поводу или интересуют другие аспекты работы с свойствами в Java, пожалуйста, не стесняйтесь задавать их!
Согласно биновской конвенции, код обычно пишется следующим образом:
private int foo;
public int getFoo() {
return foo;
}
public void setFoo(int newFoo) {
foo = newFoo;
}
В некоторых других языках, работающих на JVM, таких как Groovy, доступна возможность использования переопределяемых свойств, аналогично C#. Например, вы можете написать так:
int foo
Такое свойство можно просто использовать через .foo
, и при этом используются реализации по умолчанию для getFoo
и setFoo
, которые можно переопределить при необходимости.
В приведенном вами коде на Java используется библиотека Project Lombok для автоматического создания методов доступа (геттеров и сеттеров) к полям класса Animal
. Аннотации @Getter
и @Setter
сокращают объем кода, устраняя необходимость в ручном написании этих методов.
Вот краткое объяснение кода:
public class Animal {
@Getter @Setter private String name; // Имя животного
@Getter @Setter private String gender; // Пол животного
@Getter @Setter private String species; // Вид животного
}
Эти аннотации работают аналогично свойствам в C#, предоставляя доступ к полям name
, gender
и species
без необходимости явно объявлять методы. Это упрощает код и делает его более читаемым. Если вам нужно больше информации о Project Lombok, рекомендую ознакомиться с их документацией.
Вам не обязательно использовать префиксы "get" и "set", чтобы это выглядело больше похоже на свойства. Вы можете сделать это следующим образом:
public class Person {
private String firstName = "";
private Integer age = 0;
public String firstName() { return firstName; } // геттер
public void firstName(String val) { firstName = val; } // сеттер
public Integer age() { return age; } // геттер
public void age(Integer val) { age = val; } // сеттер
public static void main(String[] args) {
Person p = new Person();
// установка значений
p.firstName("Лемуэль");
p.age(40);
// получение значений
System.out.println(String.format("Я %s, мне %d лет",
p.firstName(),
p.age()));
}
}
Таким образом, код становится более лаконичным и удобочитаемым, при этом сохраняется функциональность доступа к полям класса.
Большинство IDE для Java, таких как Eclipse, позволяют автоматически генерировать код геттеров и сеттеров по вашему запросу. Существуют разные соглашения по их написанию, и в Eclipse вы можете выбрать ту конвенцию, которая вам нравится, а также задать свои собственные правила.
Кроме того, Eclipse предлагает автоматизированное рефакторирование, которое позволяет вам обернуть поле в геттер и сеттер, и автоматически изменит весь код, который обращается к этому полю напрямую, чтобы использовать геттер и/или сеттер.
Однако стоит помнить, что Eclipse может изменять только тот код, о котором она осведомлена — любые внешние зависимости могут быть нарушены в результате такого рефакторинга.
Инициализация ArrayList в одну строчку
Что значит 'synchronized'?
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?
Какие проблемы следует учитывать при переопределении equals и hashCode в Java?