所以,直到最近我才刻意让自己成为一个Java n00b,而我第一次真正接触到的时候却带来了不小的震撼:Java 没有 C# 风格的属性!

好吧,我可以忍受。不过,我也可以发誓,我在一个代码库中见过 Java 中的属性 getter/setter 代码,但我不记得在哪里。这是如何实现的?有语言扩展吗?与 NetBeans 或其他相关吗?

有帮助吗?

解决方案

Java 中的 getter 和 setter 有一个“标准”模式,称为 豆属性. 。基本上任何方法开头 get, 不带参数并返回一个值,是一个属性 getter,其名称为方法名称的其余部分(带有小写的起始字母)。同样地 set 使用单个参数创建 void 方法的 setter。

例如:

// Getter for "awesomeString"
public String getAwesomeString() {
  return awesomeString;
}

// Setter for "awesomeString"
public void setAwesomeString( String awesomeString ) {
  this.awesomeString = awesomeString;
}

如果您询问,大多数 Java IDE 都会为您生成这些方法(在 Eclipse 中,就像将光标移动到字段并按 ctrl-1,然后从列表中选择选项一样简单)。

就其价值而言,为了可读性,您实际上可以使用 ishas 代替 get 也适用于布尔类型属性,如下所示:

public boolean isAwesome();

public boolean hasAwesomeStuff();

其他提示

我很惊讶没有人提到 龙目岛项目

是的,目前java中没有属性。还有一些其他缺失的功能。
但幸运的是我们有 龙目岛项目 正在努力改善这种情况。它也每天都变得越来越受欢迎。

所以,如果您使用 lombok:

@Getter @Setter int awesomeInteger = 5;

这段代码将生成 getAwesomeIntegersetAwesomeInteger 以及。所以它非常类似于 C# 自动实现的属性.

您可以获得有关 lombok getter 和 setter 的更多信息 这里.
你绝对应该检查一下 其他特性 以及。我最喜欢的是:

Lombok 与 IDE 集成良好,因此它将显示生成的方法,就像它们是否存在一样(建议、类内容、转到声明和重构)。
lombok 的唯一问题是其他程序员可能不知道它。你总是可以 德伦博克 代码,但这只是一种解决方法而不是解决方案。

“Java 属性支持”是针对 Java 7 提出的,但并未纳入该语言中。

http://tech.puredanger.com/java7#property 如果有兴趣,可以获取更多链接和信息。

bean 约定是这样编写代码:

private int foo;
public int getFoo() {
    return foo;
}
public void setFoo(int newFoo) {
    foo = newFoo;
}

在 JVM 上的其他一些语言(例如 Groovy)中,您可以获得类似于 C# 的可重写属性,例如,

int foo

这是通过一个简单的访问 .foo 并利用默认值 getFoosetFoo 您可以根据需要覆盖的实现。

public class Animal {

    @Getter @Setter private String name;
    @Getter @Setter private String gender;
    @Getter @Setter private String species;
}

这有点像 C# 属性。它是 http://projectlombok.org/

您可能不需要“get”和“set”前缀,为了使其看起来更像属性,您可以这样做:

public class Person {
    private String firstName = "";
    private Integer age = 0;

    public String firstName() { return firstName; } // getter
    public void firstName(String val) { firstName = val; } // setter

    public Integer age() { return age; } // getter
    public void age(Integer val) { age = val; } //setter

    public static void main(String[] args) {
        Person p = new Person();

        //set
        p.firstName("Lemuel");
        p.age(40);

        //get
        System.out.println(String.format("I'm %s, %d yearsold",
            p.firstName(),
            p.age());
    }
}

如果您愿意,大多数 Java IDE 都会自动为您生成 getter 和 setter 代码。有许多不同的约定,像 Eclipse 这样的 IDE 将允许您选择要使用的约定,甚至可以让您定义自己的约定。

Eclipse 甚至包括自动重构,允许您将属性包装在 getter 和 setter 中,并且它将修改直接访问该属性的所有代码,以使其使用 getter 和/或 setter。

当然,Eclipse 只能修改它知道的代码 - 您拥有的任何外部依赖项都可能会被此类重构破坏。

杰弗里·里克特的通过 C# 进行 CLR:(我想这些可能是JAVA中仍然没有添加属性的原因)

  • 属性方法可能会抛出异常;字段访问永远不会抛出异常。
  • 属性不能作为 out 或者 ref 方法的参数;阿菲尔德可以。
  • 属性方法可能需要很长时间才能执行;现场访问始终立即完成。使用属性的一个常见原因是执行线程同步,这可以永远停止线程,因此,如果需要线程同步,则不应使用属性。在这种情况下,首选方法。另外,如果您的类可以远程访问(例如,您的类派生自System.MarshalByRefObject),调用属性方法将非常慢,因此,一种方法优于属性。在我看来,类派生自MarshalByRefObject 永远不应该使用属性。
  • 如果连续多次调用,则属性方法每次都可能返回一个不同的值;字段每次返回相同的值。这 System.DateTime 类有一个只读Now 返回当前日期和时间的属性。每次查询此属性时,都会返回其他值。这是一个错误,微软希望他们可以通过现在制作方法而不是属性来修复该类。 EnvironmentTickCount 财产是这个错误的另一个例子。
  • 属性方法可能会导致明显的副作用;现场访问永远不会。换句话说,类型的用户应该能够设置由他或她选择的任何顺序定义的各种属性,而无需注意类型中的任何不同行为。
  • 属性方法可能需要额外的内存或返回对实际上不是对象状态的事物的引用,因此修改返回的对象对原始对象没有影响。查询一个字段总是返回对保证成为原始对象状态一部分的对象的引用。与返回副本的属性一起工作可能会使开发人员感到困惑,而且这种特征经常没有记录。

我的Java经验也不是很高,所以请大家随时纠正我。但据我所知,一般惯例是编写两个方法,如下所示:

public string getMyString() {
    // return it here
}

public void setMyString(string myString) {
    // set it here
}

如果您使用 eclipse,那么它能够自动生成内部属性的 getter 和 setter 方法,它可能是一个有用且省时的工具。

我刚刚发布了 Java 5/6 注释和注释处理器来帮助实现这一点。

查看 http://code.google.com/p/javadude/wiki/Annotations

目前的文档还比较简单,但是快速参考应该可以传达这个想法。

基本上,它生成一个带有 getter/setter(以及许多其他代码生成选项)的超类。

示例类可能看起来像

@Bean(properties = {
    @Property(name="name", bound=true),
    @Property(name="age,type=int.class)
})
public class Person extends PersonGen {
}

还有更多可用示例,并且生成的代码中没有运行时依赖项。

如果您尝试并发现它有用,请给我发送电子邮件!——斯科特

java 中没有属性关键字(就像您在 C# 中可以找到的那样),拥有 1 个单词的 getter/setter 最接近的方法是像 C++ 中那样:

public class MyClass
{
    private int aMyAttribute;
    public MyClass()
    {
        this.aMyAttribute = 0;
    }
    public void mMyAttribute(int pMyAttributeParameter)
    {
        this.aMyAttribute = pMyAttributeParameter;
    }
    public int mMyAttribute()
    {
        return this.aMyAttribute;
    }
}
//usage :
int vIndex = 1;
MyClass vClass = new MyClass();
vClass.mMyAttribute(vIndex);
vIndex = 0;
vIndex = vClass.mMyAttribute();
// vIndex == 1

正如前面提到的 Eclipse,集成开发环境 (IDE) 通常可以自动创建访问器方法。

您还可以使用 NetBeans 来完成此操作。

要为类创建访问器方法,请打开一个类文件,然后右键单击源代码编辑器中的任意位置,然后选择菜单命令“重构”、“封装字段”。将打开一个对话框。单击全选,然后单击重构。瞧,

祝你好运,

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top