Java是否有;物业;属性在C#中的工作方式相同吗?

Java是否有;物业;属性在C#中的工作方式相同吗?,c#,java,properties,C#,Java,Properties,在C#中,您可以使用属性使数据字段可公开访问(允许用户直接访问),同时保留对直接访问的字段执行数据验证的能力。Java有类似的功能吗?例如,假设存在一个具有以下实现的C#类(见下文): 类中的此定义允许用户在从数据字段“x”中检索值并为其赋值时“自然”使用数据字段“x”。下面是它将如何在主应用程序中使用 public class Test{ public static void main(String[] args){ newInt a = new newInt();

在C#中,您可以使用属性使数据字段可公开访问(允许用户直接访问),同时保留对直接访问的字段执行数据验证的能力。Java有类似的功能吗?例如,假设存在一个具有以下实现的C#类(见下文):

类中的此定义允许用户在从数据字段“x”中检索值并为其赋值时“自然”使用数据字段“x”。下面是它将如何在主应用程序中使用

public class Test{

    public static void main(String[] args){

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

        int b = a.x;
    }
}
问题是。。。java也能做到这一点吗?如果是,它叫什么?

这就是为什么Java有getter/setter

在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; }
}

不,您将使用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);
    }
}

不,Java没有属性。Java习惯用法是使用mutator/accessor(getter/setter)。尽管很多人赞成添加它们,但它们不太可能包含在下一个版本(Java7)中

奇怪的是,JavaFX具有属性


记住,当java诞生时,它从C++中借用了很多想法。因此,一些语法和习惯用法与该语言非常相似。

有Java平台,也有Java语言

Java语言不支持属性(可能永远也不支持),但您不会被迫使用Java语言来使用Java平台(正如您不需要为了使用.NET平台而使用C#一样)

检查:

还有很多其他的。

不,没有

我在理解这个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)

顺便说一句

我不太喜欢getter和setter,但我接受它们作为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生命中

在现代C#中,您更有可能拥有
公共字符串Title{get;set;}
:)@Jon非常正确。我曾考虑过使用自动属性,但我想显示backingprivate字段,因此有一个Java模拟字段。@Oscar-因为如果使用自动属性,您可以在以后发现需要时添加验证。如果你使用了一个公共领域,那将是一个突破性的变化。@Oscar,这里有这么多。有几个原因:您不能将数据绑定到字段,如果您改变主意,将变量更改为属性是一个突破性的改变,反射与字段的交互方式与属性不同,而且(最重要的是?)字段不能成为接口的一部分。@Justin-我不喜欢使用公共字段的概念,但这似乎不是一个突破性的改变;访问公共字段或相同名称的属性将具有相同的语法。同样,C#借用自Java和Smalltalk:)哦,您拥有的多么可爱的循环属性并不完全等同于公共字段,因为访问或更改C#中的属性值可以作为方法调用来完成。在获取或设置属性值时,您可以包含其他代码。使用C#properties或getter和setter(即使您没有在其中放入任何代码)的一个优点是:您可以选择向它们添加代码,而无需更改任何依赖于API的代码。虽然不是属性语法,但它确实使处理getter/setter变得更加容易。相关文章-新的提供了Java的一流属性。@Scott这不是OP所要求的。在Java5问世后不久,Lombok就已经提供了这种功能(非常类似的功能),传统Java不支持,但Groovy支持它。因为它们是兼容的,而且几乎所有Java都是有效的Groovy,所以如果您需要Java中的属性,这是一种方法。
  NewInt a = new NewInt();
  a.x(10);
  int b = a.x();