java是不是有类似于C#属性的东西? [复制]
Posted
技术标签:
【中文标题】java是不是有类似于C#属性的东西? [复制]【英文标题】:does java have something similar to C# properties? [duplicate]java是否有类似于C#属性的东西? [复制] 【发布时间】:2011-02-27 03:22:27 【问题描述】:C# 属性(我的意思是 get 和 set 方法)是一个非常有用的特性。 java是否也有类似于C#属性的东西。我的意思是我们如何在 java 中实现类似下面的 C# 代码:
public string Name
get
return name;
set
name = value;
【问题讨论】:
见getters/setters in java 另请参阅 CodePorting C#2Java Cloud-App codeporting.com/blog/csharp-to-java-conversion/archive/2012/05/…,它会在将 C# 代码移植到 java 时自动将 C# 属性转换为 java。 实际上,您可以省略 get 和 set 前缀,并使用例如 public String name() ... 作为 getter 和 public void name(String val) ...对于二传手。 "set" 和 "get" 是传统的,但很明显,当您编写 name("Lem") 并获取 String n = name(); 时,您正在设置 您可以将Manifold compiler plugin 用于Java 中的实际属性。 @Scott 这不是 OP 所要求的。在 Java 5 出现后不久,Lombok 就已经提供了该功能(非常相似)。 【参考方案1】:您可以查看Project Lombok,因为它试图减轻编写样板 Java 代码的痛苦。它允许您使用@Getter
和@Setter
注释,这将提供getBlah()
和setBlah()
方法:
public class GetterSetterExample
@Getter @Setter private int age = 10;
或者您可以只使用@Data
,它会自动实现您的hashCode()
、equals()
、toString()
和getter 方法,以及非最终字段上的setter:
@Data public class DataExample
private String name;
然而,我在该项目中发现的问题是,它有点像巫毒教,可能会令人反感,而且您必须安装一个 Eclipse(或其他)插件才能使自动编译工作。
【讨论】:
还有一个问题是,如果您使用 Lombok,那么您将不再编写可移植的 Java 代码。 你能在这里解释一下便携吗? @NealGafter Java 代码不再可移植是什么意思? 我认为@NealGafter 指的是您的编辑器和构建工具必须支持 Lombok,因此您的代码可能无法在所有开发平台/环境上运行。 作为任何寻找 C# 行为的人的参考点,这并不完全是你仍然会调用GetterSetterExample.getAge
允许使用 = 设置属性的 C# 设置器将在此处失败 GetterSetterExample.setAge = 10
不会使用 Lombok 语法工作【参考方案2】:
属性不仅方便将getters
和setters
封装在一个单元中,而且它们在调用点提供了良好的语法。
Window.Title = "New"; //which looks natural
而 getters
和 setters
通常是
Window.setTitle("New");
【讨论】:
做增量之类的东西更糟糕:C#: Thing.Number += 1 Java: Thing.setNumber(Thing.getNumber() + 1) 这并没有回答问题,而只是描述了语法上的差异。 好吧,如果您只是在 java 中使用公共字段,那么您将能够像在 C# 中一样执行 Window.Title = "New" - 无需属性。我从来没有完全理解它们在 C# 中的意义,但我还是使用它们,因为它们很方便。 @ozzy432836 就是这种情况。你可以分配 Window.Title = "New" ,对你来说它是一个变量。但是在 C# 中,你可以向它添加一个约束,告诉它是否 Window.Title = "@some invalid value" 然后拒绝它。它是我喜欢的 C# 的美。希望java世界理解它!就像我们可以用汇编语言编写代码一样,那么为什么更高级别的语言会进化!对我来说,我觉得 java 世界对此很自负!【参考方案3】:有人提议向 Java 添加对属性(和事件)的类似 C# 的支持,但看起来这在 Java 的下一版本(Java 7)中被拒绝了。
见:
Why will there be no native properties in Java 7? Java Properties Without Getters and Setters【讨论】:
【参考方案4】:您可以只声明一个私有变量,然后手动编写方法。但是,如果您使用的是 Eclipse,您可以单击一个变量,选择“Source”和“Generate getter and setter”。这与 C# 属性一样方便。
【讨论】:
NetBeans 也提供了这样的自动方法生成 我不会说它像c#那么方便,因为我倾向于重命名属性,而不是更新属性的名称,我必须更新两个方法和一个变量; 这不是“方便”。与标准 getter/setter 相比,C# 属性提供了更多便利。【参考方案5】:不,Java 没有等价物。它只有 accessor 和 mutator 方法,getter 和 setter 方法的花哨名称。例如:
public class User
private String name;
public String getName() return this.name;
public void setName(String name) this.name = name;
【讨论】:
应该清楚的是,这些 getter/setter 方法不是单独的构造,其语法类似于 C# 中的属性。相反,它们只是我们碰巧命名为 getName() 和 setName() 的普通方法,并按照约定而不是通过专用的语言构造将它们用作属性。 没错,getName() 是 setName() 的命名纯粹是按照惯例。例如,可以决定将这些方法命名为retrieveUserName() 和assignUserName(),这样就可以了。这种约定在 Java 中是惯用的,Eclipse IDE 等工具也随之而来。 这不是只是约定。 Java Bean 有一个规范和一个使它们有用的 API。 java.sun.com/javase/technologies/desktop/javabeans/docs/… @ChrisNava 您的链接已损坏。 当我们谈论命名时,同样值得注意的是:在 C# 中,“属性是一种成员,它提供了一种灵活的机制来读取、写入或计算私有字段的值。”在 Java 或 JS 中,这个术语有不同的含义。以上是关于java是不是有类似于C#属性的东西? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
golang 是不是有类似泛型(java)的东西? [复制]
jQuery AJAX 调用中是不是有任何类似于“终于”的东西?
C# - 在 C# winform/webform 中是不是有类似 jquery handle classhtml 的东西?