Получатели и установщики Java - PullRequest
55 голосов
/ 15 декабря 2009

Есть ли лучший стандартный способ создания геттеров и сеттеров в Java?

Довольно многословно иметь явное определение методов получения и установки для каждой переменной. Есть ли лучший стандартный подход к аннотациям?

Есть ли у Spring что-то подобное?

Даже C # обладает свойствами.

Ответы [ 16 ]

64 голосов
/ 15 декабря 2009

Я не уверен, что вы считаете это «стандартным», но Project Lombok решает эту проблему. Они используют аннотации, чтобы заменить большую часть многословия Java.

Некоторые люди обращаются к альтернативным родным языкам Java, таким как Groovy или Scala. Боюсь, пройдет несколько лет - если вообще - прежде чем JSR найдет «стандартизированный» способ «исправить» это в самой Java.

18 голосов
/ 15 декабря 2009

Eclipse имеет опцию контекстного меню, которая автоматически сгенерирует их для вас, как, я уверен, делают многие другие IDE.

6 голосов
/ 22 декабря 2009

Я создал несколько аннотаций, которые не относятся к затмениям.

См. http://code.google.com/p/javadude/wiki/Annotations

Например:

package sample;

import com.javadude.annotation.Bean;
import com.javadude.annotation.Property;
import com.javadude.annotation.PropertyKind;

@Bean(properties={
    @Property(name="name"),
    @Property(name="phone", bound=true),
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
}) 
public class Person extends PersonGen {
}

Мои аннотации генерируют суперкласс; Я думаю, что Lombok изменяет фактический компилируемый класс (который официально не поддерживается Sun и может сломаться - я могу ошибаться в том, как это работает, но, исходя из того, что я видел, они должны это делать)

Наслаждайтесь! - Скотт

3 голосов
/ 16 мая 2014

Существует также проект Spring Roo с аннотацией @RooJavaBean. Он также имеет @RooToString и @RooHashCodeEquals или что-то в этом роде. Он генерирует в фоновом режиме файл AspectJ с надлежащими методами.

3 голосов
/ 22 декабря 2009

Я согласен, что геттер / сеттеры многословны. Проект Ломбок имеет хороший ответ на это, как предлагают другие. В противном случае вы можете использовать возможности вашей IDE для их генерации.

3 голосов
/ 15 декабря 2009

Вот интересные статьи на эту тему: http://cafe.elharo.com/java/why-java-doesnt-need-properties-it-already-has-them/

Я думаю, что свойства - это ярлык, но это скорее маленькая функция, чем действительно важная функция

3 голосов
/ 15 декабря 2009

Большинство IDE предоставляют ярлыки для генерации кода (например, Eclipse: щелчок правой кнопкой мыши -> Source -> Generate Getters & Setters ), хотя я понимаю, что это, вероятно, не ответ ты ищешь.

Некоторые инфраструктуры IOC позволяют аннотировать свойства, чтобы их можно было использовать в контексте инфраструктуры, например, Гобелен IOC и последняя весна, я думаю (но это использование ограничено использованием фреймворком)

2 голосов
/ 25 июля 2018

Попробуйте что-то вроде этого:

@ Getter @Setter private int age = 10;

Более подробная информация ниже:

https://projectlombok.org/features/GetterSetter

2 голосов
/ 15 декабря 2009

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

Свойства, например:

case class Person(var name:String, 
                  var age:Int);
val p = Person("John", 4)
p.name
p.name = "Charlie"
p.name

И вывод:

defined class Person
p: Person = Person(John,4)
res7: String = John
res8: String = Charlie
2 голосов
/ 15 декабря 2009

Нет лучшего способа, который является частью языка - ничего подобного ключевому слову "property".

Одна альтернатива, как уже упоминали другие, заключается в использовании вашей IDE для их генерации. Другой способ, если у вас есть много объектов, которым это необходимо, - это написать собственный инструмент генерации кода, который принимает базовый класс и создает оболочку с геттерами и сеттерами.

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

Однако, одна заключительная мысль: если ваши классы не используются просто для передачи данных, они, вероятно, не должны раскрывать свое внутреннее состояние. ИМО, классы «поведения» с геттерами и сеттерами - это запах кода.

...