代码之家  ›  专栏  ›  技术社区  ›  Ishmaeel

(否)Java中的属性?

  •  56
  • Ishmaeel  · 技术社区  · 17 年前

    所以,直到最近,我一直故意让自己保持Java n00b,我的第一次真正接触带来了一个小小的冲击:Java没有C#风格的属性!

    好吧,我可以接受。然而,我也可以发誓,我在一个代码库中看到了Java中的属性getter/setter代码,但我不记得在哪里。这是如何实现的?有语言扩展吗?它与NetBeans有关吗?

    14 回复  |  直到 12 年前
        1
  •  61
  •   Daniel A.A. Pelsmaeker    11 年前

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

    例如:

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

    如果您询问,大多数Java IDE都会为您生成这些方法(在Eclipse中,只需将光标移动到字段并点击 Ctrl键 - 1. ,然后从列表中选择选项)。

    为了它的价值,为了可读性,你实际上可以使用 is has 代替 得到 对于布尔类型的属性也是如此,如:

    public boolean isAwesome();
    
    public boolean hasAwesomeStuff();
    
        2
  •  31
  •   Aleks-Daniel Jakimenko-A. wolfrevo    9 年前

    我很惊讶没有人提到 project lombok

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

    所以,如果你正在使用lombok:

    @Getter @Setter int awesomeInteger = 5;
    

    此代码将生成 getAwesomeInteger setAwesomeInteger 也。因此,它与 C# auto-implemented properties .

    您可以获取更多关于lombok getter和setter的信息 here .
    你一定要去看看 other features 也。 我最喜欢的是:

    Lombok与IDE很好地集成在一起,因此它将显示生成的方法,就像它们是否存在一样(建议、类内容、去声明和重构)。
    lombok的唯一问题是其他程序员可能不知道它 delombok 代码,但这是一种变通方法,而不是解决方案。

        3
  •  6
  •   Hank Gay    17 年前

    “Java属性支持”是为Java 7提出的,但并没有进入语言。

    看见 http://tech.puredanger.com/java7#property 如有兴趣,请提供更多链接和信息。

        4
  •  6
  •   Calum    12 年前

    bean的约定是编写这样的代码:

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

    在JVM上的其他一些语言中,例如Groovy,你会得到类似于C#的可重写属性,例如。,

    int foo
    

    它可以通过简单的 .foo 并利用默认值 getFoo setFoo 您可以根据需要覆盖的实现。

        5
  •  6
  •   dantuch    12 年前
    public class Animal {
    
        @Getter @Setter private String name;
        @Getter @Setter private String gender;
        @Getter @Setter private String species;
    }
    

    这类似于C#属性。it is 的常用口语形式 http://projectlombok.org/

        6
  •  4
  •   LEMUEL ADANE    11 年前

    您可能不需要“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());
        }
    }
    
        7
  •  3
  •   Bill Michell    17 年前

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

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

    当然,Eclipse只能修改它所知道的代码——这样的重构可能会破坏你的任何外部依赖关系。

        8
  •  3
  •   th1rdey3    12 年前

    我的Java经验也不高,所以任何人都可以随意纠正我。但是,一般的惯例是编写两个这样的方法:

    public string getMyString() {
        // return it here
    }
    
    public void setMyString(string myString) {
        // set it here
    }
    
        9
  •  2
  •   Mark Embling    17 年前

    来自 杰弗里·里希特 CLR通过C# :(我认为这可能是JAVA中仍然没有添加属性的原因)

    • 属性方法可能会抛出异常;字段访问永远不会抛出异常。
    • 属性不能作为 out ref 方法的参数;一个领域可以。
    • 属性方法可能需要很长时间才能执行;现场访问始终完成 立即。使用属性的一个常见原因是执行线程同步, 这可能会永远停止线程,因此,属性不应该 如果需要线程同步,则使用。在这种情况下,首选一种方法。 此外,如果你的类可以远程访问(例如,你的类是从 System.MarshalByRefObject ),调用property方法将非常缓慢,并且 因此,方法比属性更可取。在我看来,类衍生自 MarshalByRefObject 永远不应该使用属性。
    • 如果连续多次调用,则属性方法可能会分别返回不同的值 时间;字段每次返回相同的值。这个 System.DateTime 类有只读 Now 返回当前日期和时间的属性。每次你查询这个 属性,它将返回不同的值。这是一个错误,微软希望如此 他们可以通过将Now设置为方法而不是属性来修复类。 Environment s TickCount 财产是这种错误的另一个例子。
    • 属性方法可能会导致可观察到的副作用;现场访问永远不会。其他 words,类型的用户应该能够在中设置由类型定义的各种属性 他或她选择的任何顺序都没有注意到类型中的任何不同行为。
    • 属性方法可能需要额外的内存或返回对某物的引用 这实际上不是对象状态的一部分,因此修改返回的对象没有 对原始对象的影响;查询字段总是返回对对象的引用 这保证是原始对象状态的一部分。与房产合作 返回副本可能会让开发人员非常困惑,而且这个特性经常 未记录。
        10
  •  1
  •   TK.    17 年前

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

        11
  •  1
  •   Scott Stanchfield    17 年前

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

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

    文档现在有点轻,但quickref应该能传达这个想法。

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

    示例类可能看起来像

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

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

    如果你尝试并发现它有用,请给我发一封电子邮件! --斯科特

        12
  •  1
  •   Patrick PIGNOL    7 年前

    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
    
        13
  •  0
  •   Mario Levesque    7 年前

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

    您也可以使用NetBeans来实现。

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

    祝你好运,