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】:

属性不仅方便将getterssetters 封装在一个单元中,而且它们在调用点提供了良好的语法。

Window.Title =  "New"; //which looks natural

getterssetters 通常是

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)的东西? [复制]

java有类似于C#属性的东西吗? [重复]

jQuery AJAX 调用中是不是有任何类似于“终于”的东西?

C# - 在 C# winform/webform 中是不是有类似 jquery handle classhtml 的东西?

C# 中的“var”是不是类似于 C 中的“size_t”?

Python(FLASK) 是不是有类似 nodaemon 的东西? [复制]