Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

为什么使用getter/setter方法,不是多此一举吗? #25

Open
bitfishxyz opened this issue Aug 16, 2019 · 2 comments
Open

为什么使用getter/setter方法,不是多此一举吗? #25

bitfishxyz opened this issue Aug 16, 2019 · 2 comments
Labels
SO Stack Overflow相关问答

Comments

@bitfishxyz
Copy link
Member

为什么使用getter/setter方法?不是多此一举吗?

1568091

public String foo;

上面的代码真的不如下面的吗?

private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }

下面这种写法有什么意义吗?

@bitfishxyz bitfishxyz added the SO Stack Overflow相关问答 label Aug 16, 2019
@bitfishxyz
Copy link
Member Author

支持Setter、Getter方的观点

很好的封装了对象的行为

如果你日后希望在别人访问这个字段的时候做出一些额外的事情,那么一开始就使用getter/setter方法可以让你更加轻松的修改。getter/setter方法就是天生的拦截器

private String foo;
public void setFoo(String foo) { 
  this.foo = foo;
  System.out.println("you are setting foo");
}
public String getFoo() { 
  System.out.println("you relize you need" + 
    " do something two month later");
  return foo; 
}

模拟ReadOnly功能

如果你只实现了get而没有实现set,那么这个字段就是read only的了。

隐藏了对象的内部信息。

private char[] name;
public void setName(String foo) {
  this.name = foo.toCharArray(); 
}
public String getName() { 
  return  String.valueOf(name);
 }

你以为name是String,其实它是char[].

方便Debug

你可以在set get方法上打断点,
来探索运行时这个对象的属性的值是
什么时候发生改变的。很多时候这非常有用。

允许子类做更多的事情

子类可以通过覆盖父类的getter settter方法,来改变一些事情

内存管理

允许你对这个字段占用的内存手动的管理

更好的访问权限控制

private String foo;
public void setFoo(String foo) { this.foo = foo; }
protected String getFoo() { return foo; }

getter 和 setter有不同的访问控制符

@bitfishxyz
Copy link
Member Author

反对方的理由

  1. 如果你真的需要对get / set进行监控的话,你只需要让这个字段变为private,然后编辑器就会提醒你在哪些地方使用了这个值,你前往相关的代码进行处理就行了,没必要使用getter setter 方法

  2. 在setter 方法中对字段进行校验真的很少用,你在给对象赋值前进行处理不就行了?

  3. 如果你在setter方法对参数的值做出了修改,这对调用这个方法的人来说是一个噩梦

  4. 你确实可以在子类继承的时候覆盖父类的方法,但是,这对调用者来说真的很容易出错。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
SO Stack Overflow相关问答
Projects
None yet
Development

No branches or pull requests

1 participant