Есть ли у 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.