Есть ли у Java "свойства", которые работают так же, как свойства работают на С#?
В С# вы можете использовать свойства, чтобы сделать поле данных общедоступным (позволяя пользователю напрямую обращаться к нему), но при этом сохраняя возможность выполнять проверку данных для этих полей с прямым доступом. Есть ли у Java что-то подобное? Предположим, что для экземпляра существует класс С# со следующей реализацией (см. Ниже):
public class newInt{
public newInt(){...}
public int x{
get{ return this.x }
set{ this.x = isValid(value) }
}
}
private static int isValid(int value){...}
Это определение в классе позволяет пользователю "естественно" использовать поле данных "x" при извлечении из него значений и присвоении ему значений. Ниже описано, как он будет использоваться в основном.
public class Test{
public static void main(String[] args){
newInt a = new newInt();
a.x = 50;
int b = a.x;
}
}
Вопрос в том, может ли java сделать это тоже? если да, то как это называется?
Ответы
Ответ 1
Нет.
Вот почему Java имеет getters/setters.
В С# у вас обычно есть что-то вроде:
public class SomeObject
{
private string _title = "";
public string Title { get { return _title; } set { _title = value; } }
}
// Or with Auto-Properties
public class SomeObjectAutoProperties
{
public string Title { get; set; }
}
эквивалент гейтера/сеттера Java:
public class SomeObject
{
private String _title = "";
public string getTitle() { return _title; }
public void setTitle(String value) { _title = value; }
}
Ответ 2
Нет, вместо этого вы бы использовали методы getter и setter. Это соглашение Java.
public class newInt {
public newInt() {...}
private int _x = 0;
public int getX() {
return this._x;
}
public void setX(int x) {
this._x = isValid(x);
}
}
Ответ 3
Там платформа Java, и там язык Java.
Язык Java не поддерживает свойства (и, вероятно, никогда не будет), но вы не должны использовать язык Java для работы с платформой Java (так же, как вам не нужно придерживаться С#, чтобы работать с .NET).
Проверьте:
И многие другие.
Ответ 4
Нет. Java не имеет свойств. Идиомой Java является использование mutator/accessor (getter/setter). Несмотря на то, что многие люди предпочитают добавлять их, вряд ли они будут включены в следующую версию (Java 7).
Любопытно, что JavaFX обладает свойствами.
Имейте в виду, что когда Java родилась, он заимствовал много идей из С++. Таким образом, некоторые синтаксис и идиомы очень похожи на этот язык.
Ответ 5
Нет, нет.
У меня действительно есть проблема с пониманием этих свойств С#, потому что, я думаю, одно из правил состоит в том, чтобы выполнять как можно меньше кода в них, и поскольку они уже общедоступны, почему бы не использовать публичные атрибуты
Итак, ваш эквивалент Java (и, вероятно, уродливый):
public class NewInt { // In Java class names start with uppercase by convention
public int x;
}
И вы используете его как:
NewInt ni = new NewInt();
ni.x = 50;
int b = ni.x;
Есть что-то, чего я точно не знаю, но в большинстве случаев это было бы (BTW, я никогда не кодирую: P)
BTW
Мне не нравятся getters и seters, но я принимаю их как часть соглашений Java.
Я просто хотел бы, чтобы они использовали это вместо:
public class NewInt {
private int x;
public int x(){
return this.x;
}
public void x(int value ) {
this.x=value;
}
}
Таким образом, использование было бы:
NewInt a = new NewInt();
a.x(10);
int b = a.x();
Вероятно, в следующей жизни Java.