Java是否有;物业;属性在C#中的工作方式相同吗?
在C#中,您可以使用属性使数据字段可公开访问(允许用户直接访问),同时保留对直接访问的字段执行数据验证的能力。Java有类似的功能吗?例如,假设存在一个具有以下实现的C#类(见下文): 类中的此定义允许用户在从数据字段“x”中检索值并为其赋值时“自然”使用数据字段“x”。下面是它将如何在主应用程序中使用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();
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#一样) 检查:
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();