Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的getter/setter_Java_Actionscript 3_Setter_Getter_Accessor - Fatal编程技术网

Java中的getter/setter

Java中的getter/setter,java,actionscript-3,setter,getter,accessor,Java,Actionscript 3,Setter,Getter,Accessor,我是Java新手,但对ActionScript3有一些OOP经验,所以我正试图依靠我所知道的东西进行迁移 在ActionScript3中,您可以使用get和set关键字创建getter和setter,这意味着您可以在类中创建一个方法,并通过该类实例的属性访问数据。我可能听起来很复杂,但事实并非如此。下面是一个例子: class Dummy{ private var _name:String; public function Dummy(name:String=null){

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

在ActionScript3中,您可以使用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等价的工具,如
从类的实例访问私有字段作为字段,但在类内部有一个实现该字段的方法?

否。AS3的getter和setter是ECMAScript的东西。在Java中,您必须使用getVal()和setVal()样式的函数——没有任何语法上的糖分来简化操作


我认为Eclipse可以帮助自动生成这些类型的东西,尽管…

在Java中,不暴露对象内部的唯一选择是像示例中那样创建自己的getter和setter


惯例是在正在更改的字段前面加上
get
set
。因此,在您的示例中,
name
字段将分别使用
getName
setName
方法作为其相应的getter和setter。

您的Java代码很好,只是您希望将
\u name
设为私有

Java中没有像AS3示例中那样的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;
  }
}

遗憾的是,java中没有同等的语言级支持


但是get*和set*模式是在java文化中建立起来的,因此您会发现对它们的强大IDE支持(例如,eclipse会自动为您创建它们),如果您使用的是最初为JSP(EL)设计的表达式语言,然后你就可以使用属性记号来访问GETTER和SETTER。

< P>我会考虑不使用GETER或SETER,因为它们在你的情况下不做任何事情,只是使代码更复杂。下面是一个没有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

我不想让事情变得比你需要的更复杂。通常情况下,在添加setter和getter之前,添加复杂性也会受到影响,问问自己为什么要公开所讨论对象的内部数据可能是个好主意。
我建议你读这篇文章-
独立于IDE的方法是使用一个基于注释的库,它生成getter、setter,甚至
equals()
hashcode()
。它对编译器执行此操作,但不在源文件中,因此您不必查看这些方法,只需使用它们即可

看起来您遇到了java程序员非常敏感的问题;)感谢您的链接,在编写Java时,我将坚持Java约定。我保证在谈论Java时会调用属性字段;)@属性和字段是不同的概念。属性可以存储在字段中,也可以不存储在字段中(圆的面积是一个属性,可能有一个getArea方法,但在内部它可以从半径计算)。@Adam我认为类的函数称为方法(私有、公共等),类的变量称为属性/字段。我不能百分之百肯定我是以你为榜样的。你是说circle.area和circle.getArea()都是circle类的属性?感谢您指出属性和字段是不同的。@乔治:类的变量称为字段。属性是一个更一般的概念。类的属性可以显式存储在字段中,但也可以根据需要进行计算。详细说明cirlce示例:我们可能有一个cirlce类,其中一个字段存储半径。圆至少有两个属性(半径和面积),但只存储前者。另一个可以使用getArea()(内部使用radius字段)进行查询。关于Java中变量的命名,官方命名约定可能不鼓励使用下划线,但最终由软件开发人员及其团队(或公司)决定使用何种约定进行编码。我当然看到过我的第三方代码(Java和其他)使用下划线作为变量……我想我至少在RIM Blackberry官方文档中看到过一次……Netbeans和“封装字段”也是如此,Emacs/JDEE和M-x jde-gen-get-set-methods也是如此。是的——你选择的编辑器可能也可以做同样的事情。我听说M-x M-butterfly甚至可以为您编写程序的其余部分:)对Alan Holub说的任何话都要三缄其口;他是一个隐藏数据的极端分子。如果您正在编写模拟应用程序,我同意您不想公开状态;但对于其他应用程序,将封装视为数据保护(控制数据更改)与数据隐藏(不允许其他人知道你有数据)我想有人可以称Holub为极端分子,但Joshua Bloch也提出了Holub point,请参见有效的Java第13项-可怕的设计(怪异的红色,许多不同和不合适的字体),方便的工具!谢谢你!我知道你错了。封装表明所有字段都必须是私有的,getter和setter方法用于访问字段。如果您使用虚拟类编写复杂的应用程序,并且有一天您不得不认为名称不能为空,那么George的类可以通过检查重写。如果必须对类执行相同的修改,则必须私有化name字段,编写getter a