2009-12-15 6 views
52

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

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

Есть ли у Весны что-то вроде этого?

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

+16

Возможно, это не то, что вы хотите услышать, но большинство IDE могут сгенерировать их для вас. –

+0

Чтобы ответить на весну, вопрос: Нет, не совсем. Кроме того, после «программирования» XML в течение нескольких дней вы снова попросите радость от кодирования аккуратных, сжатых геттеров и сеттеров :) –

+0

Исправьте меня, если я ошибаюсь, но вам все еще нужно писать свойства C#, не так ли? Это не значит, что они подразумеваются, и вам нужно только написать их, если вы хотите расширить основное поведение чтения/записи в переменную. Единственное, что у них есть, - это то, что он держит их бок о бок. – David

ответ

18

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

+1

Если вы собираетесь проголосовать за меня, по крайней мере, укажите причину. – Ascalonian

+2

Не совсем лучшее решение, но это то, к чему мы ограничены. – WhyNotHugo

+2

всякий раз, когда я что-то делаю с кучей полей, я просто удаляю геттеры и сеттеры и затмеваю их все. Это шум. – gtrak

3

Большинство Иды обеспечивают быстрый для генерации кода (например Eclipse: правой кнопкой мыши -> Источник -> Создать Геттеры & сеттеры), хотя я понимаю, что это, вероятно, не ответ, который вы ищете.

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

1

Да, вам не повезло. Groovy действительно генерирует их для вас, но нет кубиков в стандартной java. Если вы используете Eclipse, вы можете generate them pretty easily, а также генерировать функции hashCode() и equals().

58

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

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

+8

+1: Lombok - отличное дополнение, а также может позаботиться о hashCode, equals & toString .. Стоит искать глупые классы данных. – Tim

+2

+1 для Lombok как очень классный, но -1 для того, чтобы быть специфически специфичным для IDE. Любая другая IDE, и вы получаете массу ошибок, украшающих код, поскольку IDE doeesn't не знает, что происходит. Я также не совсем уверен, как это работает с отладчиками. –

+1

Он отлично работает с Maven, и они просто добавили опцию de-lombok, которая генерирует исходный код без каких-либо ссылок на lombok. – Tim

3

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

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

+1

Я провел несколько лет, развиваясь в Delphi. Я всегда считал свойства одной из лучших функций Delphi. Мне всегда было грустно, что у Java нет этой функции. Андерс Хейлсберг создал свойства в C#, и теперь у них есть у них люди, а у нас нет. Это может быть «маленькая» функция, но все, что сокращает код, сокращает количество ошибок и повышает понятность. –

+1

Джером - я не согласен. Связывание в Java в настоящее время искалечено b/c из-за отсутствия поддержки. Представьте, если вы не смогли получить статический член .class, но вместо этого пришлось работать с передачей строк. Я продолжаю видеть, как люди пишут, что свойства на этом языке будут просто синтаксическим сахаром, но это просто не так. –

2

С Netbeans, просто начните набирать получить или установить, где геттер/сеттер должен быть заменен и вызывать автоматическое завершение (Ctrl + Space), это даст вам возможность генерировать геттер или сеттер. Он также даст вам возможность генерировать конструктор.

+0

У Eclipse тоже есть что-то похожее. –

+0

Так же и IntelliJ IDEA. Это делает 3 основных Java IDE, которые вы можете использовать для решения этой проблемы. –

1

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

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

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

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

2

В качестве альтернативы вы пробовали 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 
+1

Изменение технологии. – Sylar

+0

Технически Java является подмножеством Scala, поэтому проблема, вероятно, может быть решена с использованием этого подхода. –

+4

Я с тобой по нраву Скала (и поэтому поднял тебя обратно до 0), но «ты пробовал Скала?» задает немного. Scala имеет некоторое сходство с Java, но различия настолько велики, что я некоторое время пытался «закодировать Java в Scala» и сдался. Хотя радость потерять геттеры/сеттеры, Scala требует твердых обязательств. –

0

Это работы IDE для создания повторяющихся многословный код, геттеры/сеттеры

+3

Я не согласен, но я считаю, что это признак слабости в языке, когда генерация кода требуется для выполнения повторяющихся задач. Если среда IDE достаточно умен, чтобы сделать это для вас, язык тоже должен быть! –

+0

IDE недостаточно умен, чтобы сделать это, он генерирует код тогда и только тогда, когда вы решите предоставить геттеры и/или сеттеры и только для нужных переменных экземпляра. По умолчанию вся переменная не читается/модифицируется, если не объявлена ​​общедоступной. О многословии Java предоставляет больше, чем просто чтение/модификацию этих переменных, но может выполнять некоторую логику, прежде чем изменять или возвращать значение, соответствующее переменным, опять же, только если вы решите. – user225486

+0

На этом этапе вы противоречите своему собственному ответу. Вы говорите, что это работа пользователя, чтобы сообщить IDE создать повторяющийся подробный код. Конечно, это точно, как это работает, и я чувствую, что это очень уродливо. Delphi, Ruby и другие языки позволяют вам использовать простые ключевые слова для автоматического генерации простых геттеров и сеттеров, а * еще * дает вам свободу добавлять тесты, побочные эффекты, абстракции или что-то еще, что вам нужно, если хотите. –

0

Используйте IDE для создания это для вас и попытаться свести к минимуму количество геттеров/сеттеров, которые у вас есть - вы, вероятно, будете пользоваться дополнительным преимуществом неизменности.

Мне нравится синтаксис C# для свойств, я думаю, что он довольно и чистый, и довольно чистый.

0

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

+1

они не более эффективны, так как точка доступа знает, как встроить геттеры и сеттеры – gtrak

6

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

См 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 и может сломаться - я мог ошибаться в том, как он работает, но на основе того, что я видел, они должны это делать)

Наслаждайтесь! - Scott

0

Если вы используете emacs, возможно определить макрос emacs, который сделает это за вас. Какие-нибудь гуру emacs? :)

3

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

2

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