【问题标题】: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;
    }
}

【问题讨论】:

  • 另请参阅 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 就已经提供了该功能(非常相似)。

标签: c# java properties


【解决方案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)中被拒绝了。

见:

【讨论】:

    【解决方案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 中,这个术语有不同的含义。
    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多