(нет) свойства в Java?
Итак, я умышленно держал себя Java n00b до недавнего времени, и мое первое реальное воздействие вызвало небольшой шок: Java не имеет свойств стиля C#!
Ок, я могу жить с этим. Тем не менее, я также могу поклясться, что видел код геттера/сеттера свойств в Java в одной кодовой базе, но я не могу вспомнить, где. Как это было достигнуто? Есть ли расширение языка для этого? Это связано с NetBeans или что-то?
12 ответов:
существует "стандартный" шаблон для геттеров и сеттеров в Java, называемый свойства фасоли. В основном любой метод, начиная с
get
, не беря аргументов и возвращая значение, является получателем свойств для свойства, названного как остальная часть имени метода (со строчной начальной буквой). Аналогичным образомset
создает сеттер метода void с одним аргументом.например:
// Getter for "awesomeString" public String getAwesomeString() { return awesomeString; } // Setter for "awesomeString" public void setAwesomeString( String awesomeString ) { this.awesomeString = awesomeString; }
большинство Java IDE будет генерировать эти методы для вас, если вы спрашиваете их (в Eclipse это так же просто, как переместить курсор в поле и нажать ctrl-1, а затем выбрать опцию из списка).
для чего это стоит, для удобства чтения вы можете использовать
is
иhas
на местеget
для свойств типа boolean тоже, как в:public boolean isAwesome(); public boolean hasAwesomeStuff();
Я удивлен, что никто не упомянул проект Lombok
Да, в настоящее время нет никаких свойств в java. Есть и другие недостающие функции.
Но, к счастью, у нас есть проект Lombok то есть пытается улучшить ситуацию. Он также становится все более и более популярным с каждым днем.Итак, если вы используете Ломбок:
@Getter @Setter int awesomeInteger = 5;
этот код будет генерировать
getAwesomeInteger
иsetAwesomeInteger
Как хорошо. Так что это очень похоже к в C# автоматически реализуемые свойства.вы можете получить дополнительную информацию о lombok геттеров и сеттеров здесь.
Вы должны обязательно проверить другие особенности как хорошо. Мои любимые:Ломбок хорошо интегрирован с IDEs, поэтому он будет показывать сгенерированные методы, такие как если бы они существовали (предложения, содержимое класса, переход к объявлению и рефакторингу).
Единственная проблема с Ломбоком заключается в том, что другие программисты могут не знать об этом. Вы всегда можете delombok код, но это скорее временное решение, чем решение.
соглашение bean состоит в том, чтобы написать код следующим образом:
private int foo; public int getFoo() { return foo; } public void setFoo(int newFoo) { foo = newFoo; }
в некоторых других языках на JVM, например, Groovy, вы получаете переопределяемые свойства, подобные C#, например,
int foo
доступ к которому осуществляется с помощью простого
.foo
и использует по умолчаниюgetFoo
иsetFoo
реализации, которые можно переопределить по мере необходимости.
public class Animal { @Getter @Setter private String name; @Getter @Setter private String gender; @Getter @Setter private String species; }
Это что-то вроде C# свойства. Это http://projectlombok.org/
"поддержка свойств Java" была предложена для Java 7, но не вошла в язык.
см.http://tech.puredanger.com/java7#property для получения дополнительных ссылок и информации, если это интересно.
возможно, Вам не нужны префиксы "get" и "set", чтобы сделать его более похожим на свойства, вы можете сделать это следующим образом:
public class Person { private String firstName = ""; private Integer age = 0; public String firstName() { return firstName; } // getter public void firstName(String val) { firstName = val; } // setter public Integer age() { return age; } // getter public void age(Integer val) { age = val; } //setter public static void main(String[] args) { Person p = new Person(); //set p.firstName("Lemuel"); p.age(40); //get System.out.println(String.format("I'm %s, %d yearsold", p.firstName(), p.age()); } }
большинство IDE для Java будет автоматически генерировать getter и setter код для вас, если вы хотите, чтобы они. Существует несколько различных соглашений, и IDE, такая как Eclipse, позволит вам выбрать, какой из них вы хотите использовать, и даже позволить вам определить свой собственный.
Eclipse даже включает автоматический рефакторинг, который позволит вам обернуть свойство в геттер и сеттер, и он изменит весь код, который обращается к свойству напрямую, чтобы он использовал геттер и/или сеттер.
конечно, Eclipse может изменять только тот код, о котором он знает - любые внешние зависимости, которые у вас есть, могут быть нарушены таким рефакторингом.
С Джеффри Рихтера!--10--> книги CLR через C#: (Я думаю, что это могут быть причины, по которым свойства все еще не добавлены в JAVA)
- метод свойства может вызвать исключение; доступ к полю никогда не вызывает исключения.
- свойство не может быть передано как
out
илиref
параметр метода; поле может.- метод свойства может занять много времени для выполнения; доступ к полю всегда завершается немедленно. Распространенной причиной использования свойств является выполнение синхронизации потоков, который может остановить поток навсегда, и поэтому свойство не должно быть используется, если требуется синхронизация потоков. В этой ситуации предпочтительным является метод. Кроме того, если к вашему классу можно получить удаленный доступ (например, ваш класс является производным от
System.MarshalByRefObject
), вызов метода свойства будет очень медленным, и таким образом, метод является предпочтительным в собственность. На мой взгляд, классы, полученные изMarshalByRefObject
никогда не следует использовать свойства.- если вызывается несколько раз подряд, метод свойства может возвращать разные значения в каждом время; поле возвращает одно и то же значение каждый раз. Элемент
System.DateTime
класс имеет только для чтенияNow
свойство, которое возвращает текущую дату и время. Каждый раз, когда вы запрашиваете это свойство, оно будет возвращать другое значение. Это ошибка, и Microsoft хочет, чтобы они могли бы исправить класс, сделав теперь метод вместо свойства.Environment
' sTickCount
свойство является еще одним примером этого ошибка.- метод свойства может вызвать наблюдаемые побочные эффекты; доступ к полю никогда не делает. В других слова, пользователь типа должен иметь возможность устанавливать различные свойства, определенные типом в любой порядок он или она выбирает, не замечая никакого другого поведения в типе.
- метод свойства может потребовать дополнительной памяти или вернуть ссылку на что-то это на самом деле не является частью состояния объекта, поэтому изменение возвращаемого объекта не имеет влияние на оригинал объект; запрос поля всегда возвращает ссылку на объект это гарантированно будет частью состояния исходного объекта. Работа с объектом недвижимости что возвращает копию может быть очень запутанным для разработчиков, и эта характеристика часто не задокументировано.
мой опыт Java тоже не так высок,поэтому любой может исправить меня. Но AFAIK, общее соглашение состоит в том, чтобы написать два метода так:
public string getMyString() { // return it here } public void setMyString(string myString) { // set it here }
Если вы используете eclipse, то он имеет возможность автоматически генерировать метод getter и setter для внутренних атрибутов, это может быть полезным и экономящим время инструментом.
Я просто выпускаю аннотации Java 5/6 и процессор аннотаций, чтобы помочь этому.
проверить http://code.google.com/p/javadude/wiki/Annotations
документация немного легкая прямо сейчас, но quickref должен получить идею.
в основном он генерирует суперкласс с геттерами / сеттерами (и многими другими вариантами генерации кода).
пример класса может выглядеть как
@Bean(properties = { @Property(name="name", bound=true), @Property(name="age,type=int.class) }) public class Person extends PersonGen { }
есть доступно еще много примеров, и в сгенерированном коде нет зависимостей времени выполнения.
отправить мне письмо, если вы попробовать его и найти его полезным! -- Скотт
в java нет ключевого слова свойства (например, вы можете найти его в C#) ближайший способ получить 1 слово getter / setter-это сделать, как в C++:
public class MyClass { private int aMyAttribute; public MyClass() { this.aMyAttribute = 0; } public void mMyAttribute(int pMyAttributeParameter) { this.aMyAttribute = pMyAttributeParameter; } public int mMyAttribute() { return this.aMyAttribute; } } //usage : int vIndex = 1; MyClass vClass = new MyClass(); vClass.mMyAttribute(vIndex); vIndex = 0; vIndex = vClass.mMyAttribute(); // vIndex == 1