Есть ли в Java «свойства», которые работают так же, как свойства работают в C #? - PullRequest
18 голосов
/ 23 апреля 2010

В C # вы можете использовать свойства, чтобы сделать поле данных общедоступным (позволяя пользователю получить к нему прямой доступ), и в то же время сохранить возможность выполнять проверку данных в этих полях, к которым имеется прямой доступ. Есть ли в Java что-то похожее? Например, предположим, что существует класс C # со следующей реализацией (см. Ниже):

public class newInt{

    public newInt(){...}

    public int x{
        get{ return this.x }
        set{ this.x = isValid(value) }
    }
}

private static int isValid(int value){...}

Это определение в классе позволяет пользователю «естественным образом» использовать поле данных «x» при извлечении значений из него и присвоении ему значений. Ниже описано, как это будет использоваться в main.

public class Test{

    public static void main(String[] args){

        newInt a = new newInt();
        a.x = 50;

        int b = a.x;
    }
}

Вопрос в том ... может ли Java это сделать? если да, то как это называется?

Ответы [ 5 ]

20 голосов
/ 23 апреля 2010

номер

Вот почему в Java есть геттеры / сеттеры.

В C # у вас обычно есть что-то вроде:

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 getter / setter будет:

public class SomeObject
{
    private String _title = "";

    public string getTitle() { return _title; }

    public void setTitle(String value) { _title = value; }
}
4 голосов
/ 23 апреля 2010

Есть платформа Java, и есть язык Java.

Язык Java не поддерживает свойства (и, вероятно, никогда не будет), но вы не обязаны использовать язык Java для работы с платформой Java (так же как вам не нужно придерживаться C # для работы Платформа .NET).

Проверка:

и многие другие.

4 голосов
/ 23 апреля 2010

Нет, вы бы вместо этого использовали методы 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);
    }
}
2 голосов
/ 23 апреля 2010

Нет. У Java нет свойств. Идиома Java - использовать мутатор / аксессор (getter / setter). Несмотря на то, что многие люди поддерживают их добавление, маловероятно, что они будут включены в следующую версию (Java 7).

Любопытно, что JavaFX обладает свойствами.

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

1 голос
/ 23 апреля 2010

Нет, не имеет.

У меня действительно есть небольшая проблема, чтобы понять эти свойства C #, потому что, я думаю, одно из правил состоит в том, чтобы выполнять как можно меньше кода в них, и поскольку они уже общедоступны, почему бы не использовать вместо них публичные атрибуты

Итак, ваш 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;

Есть кое-что, что я упускаю, это наверняка, но, в большинстве случаев, это будет иметь место (кстати, я никогда не кодирую так: P)

КСТАТИ

Мне не очень нравятся геттеры и сеттеры, но я принимаю их как часть соглашений 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...