23

我是 Java 新手,但对 ActionScript 3 有一些 OOP 经验,所以我试图依靠我知道的东西进行迁移。

在 ActionScript 3 中,您可以使用 get 和 set 关键字创建 getter 和 setter,这意味着您可以在类中创建一个方法并通过该类实例的属性访问数据。我可能听起来很复杂,但事实并非如此。这是一个例子:

class Dummy{

    private var _name:String;

    public function Dummy(name:String=null){
        this._name = name;
    }

    //getter
    public function get name():String{
        return _name;
    }

    //setter
    public function set name(value:String):void{
    //do some validation if necessary
        _name = value;
    }

}

我会name在一个对象中访问:

var dummy:Dummy = new Dummy("fred");
trace(dummy.name);//prints: fred
dummy.name = "lolo";//setter
trace(dummy.name);//getter

我将如何在 Java 中做到这一点?

仅仅拥有一些公共领域是不可能的。我注意到在方法前面有使用 get 和 set 的约定,我可以接受。

例如,

class Dummy{

    String _name;

    public void Dummy(){}

    public void Dummy(String name){
        _name = name;
    }

    public String getName(){
        return _name;
    }

    public void setName(String name){
        _name = name;
    }

}

Java 中是否有与 ActionScript 3 的 getter/setter 等效的方法,例如从类的实例中将私有字段作为字段访问,但在类内部有实现该字段的方法?

4

7 回答 7

20

没有。AS3 getter 和 setter 是 ECMAScript 的东西。在 Java 中,您会被 getVal() 和 setVal() 风格的函数所困扰——没有任何语法糖可以让您轻松处理事情。

我认为 Eclipse 可以帮助自动生成这些类型的东西......

于 2009-05-17T17:28:57.860 回答
10

您的 Java 代码很好,除了您想要将_name 私有.

在您的 AS3 示例中,Java中没有getset关键字。对不起,它并没有比你已经在做的更好。

更正的代码:

class Dummy {
  private String _name;

  public void Dummy() {}

  public void Dummy(String name) {
    setName(name);
  }

  public String getName() {
    return _name;
  }

  public void setName(String value) {
    _name = value;
  }
}
于 2009-05-17T17:29:46.690 回答
3

可悲的是,不,java 中没有等效的语言级支持。

get* 和 set* 模式在 Java 文化中已经非常成熟,以至于您会发现对它们的强大 IDE 支持(例如,eclipse 会自动为您生成它们),并且如果您正在使用首先使用表达式语言的东西为 jsps (EL) 制作,那么您将能够使用属性表示法来访问 getter 和 setter。

于 2009-05-17T17:31:06.733 回答
3

我会考虑没有 getter 或 setter,因为它们在你的情况下不做任何事情,除了让代码更复杂。这是一个没有 getter 或 setter 的示例。

class Dummy {
  public String name;
  public Dummy(String name) { this.name = name; }
}

Dummy dummy = new Dummy("fred");
System.out.println(dummy.name);//getter, prints: fred
dummy.name = "lolo";//setter
System.out.println(dummy.name);//getter, prints: lolo

恕我直言,不要让事情变得比你需要的更复杂。通常情况下,增加复杂性会受到You-Aint-Gonna-Need-It 的影响

于 2009-05-17T17:52:29.080 回答
3

一种独立于 IDE 的方法是使用Lombok,这是一个基于注释的库,可以生成 getter、setter 甚至equals()hashcode(). 它为编译器执行此操作,但不在源文件中,因此您不必查看方法,只需使用它们即可。

于 2010-01-03T18:21:56.513 回答
2

在 Java 中,在不暴露对象内部的情况下,唯一的选择是制作自己的 getter 和 setter,就像在示例中一样。

约定是在要更改的字段之前getset前面。因此,就像在您的示例中一样,该字段name将分别具有getNamesetName方法作为其对应的 getter 和 setter。

于 2009-05-17T17:29:42.477 回答
1

此外,在添加 setter 和 getter 之前,最好问问自己为什么要公开相关对象的内部数据。
我建议你阅读这篇文章 - http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

于 2009-05-17T20:14:04.613 回答