使用getter和setter的优点是什么 - 只能获取和设置 - 而不是简单地使用公共字段来存储这些变量?
如果getter和setter做的不仅仅是简单的get/set,我可以非常快地解决这个问题,但我并不是100%清楚如何:
public String foo;
Run Code Online (Sandbox Code Playgroud)
更糟糕的是:
private String foo;
public void setFoo(String foo) { this.foo = foo; }
public String getFoo() { return foo; }
Run Code Online (Sandbox Code Playgroud)
而前者需要很少的样板代码.
我动态地在我的android项目中创建所有元素.我试图获得按钮的宽度和高度,以便我可以旋转该按钮.我只是想学习如何使用android语言.但是,它返回0.
我做了一些研究,我发现它需要在onCreate()方法之外的某个地方完成.如果有人能给我一个如何做的例子,那就太好了.
这是我目前的代码:
package com.animation;
import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.LinearLayout;
public class AnimateScreen extends Activity {
//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(30, 20, 30, 0);
Button bt = new Button(this);
bt.setText(String.valueOf(bt.getWidth()));
RotateAnimation ra = new RotateAnimation(0,360,bt.getWidth() / 2,bt.getHeight() / 2);
ra.setDuration(3000L);
ra.setRepeatMode(Animation.RESTART);
ra.setRepeatCount(Animation.INFINITE);
ra.setInterpolator(new LinearInterpolator());
bt.startAnimation(ra);
ll.addView(bt,layoutParams);
setContentView(ll);
} …Run Code Online (Sandbox Code Playgroud) 假设我像这样指定一个outputText组件:
<h:outputText value="#{ManagedBean.someProperty}"/>
Run Code Online (Sandbox Code Playgroud)
如果我在someProperty调用getter for时打印一条日志消息并加载页面,那么注意每个请求多次调用getter是很容易的(在我的情况下发生了两次或三次):
DEBUG 2010-01-18 23:31:40,104 (ManagedBean.java:13) - Getting some property
DEBUG 2010-01-18 23:31:40,104 (ManagedBean.java:13) - Getting some property
Run Code Online (Sandbox Code Playgroud)
如果someProperty计算的值很昂贵,这可能是一个问题.
我用Google搜索了一下,认为这是一个已知问题.一个解决方法是包括一个检查,看看它是否已经计算过:
private String someProperty;
public String getSomeProperty() {
if (this.someProperty == null) {
this.someProperty = this.calculatePropertyValue();
}
return this.someProperty;
}
Run Code Online (Sandbox Code Playgroud)
这个问题的主要问题是你得到大量的样板代码,更不用说你可能不需要的私有变量了.
这种方法有哪些替代方案?没有那么多不必要的代码,有没有办法实现这一目标?有没有办法阻止JSF以这种方式行事?
感谢您的输入!
我目前正在开发一个简单的Java游戏,有几种不同的模式.我扩展了一个主要的Game类,将主要逻辑放在其他类中.尽管如此,主要的游戏类仍然非常沉重.
在快速浏览一下我的代码后,其中大部分是Getters and Setters(60%),而其余部分则是游戏逻辑真正需要的.
一些谷歌搜索声称Getters和Setters是邪恶的,而其他人声称他们是良好的OO练习和伟大的程序所必需的.
所以我该怎么做?应该是哪个?我应该为我的私人变量更改我的Getters和Setter,还是应该坚持使用它们?
通过"生成",我的意思是自动生成特定选择的(一组)变量所需的代码.
但欢迎任何更明确的解释或对良好做法的评论.
我似乎有一种奇怪的习惯......据我的同事说,至少.我们一直在一个小项目上工作.我编写类的方式是(简化示例):
[Serializable()]
public class Foo
{
public Foo()
{ }
private Bar _bar;
public Bar Bar
{
get
{
if (_bar == null)
_bar = new Bar();
return _bar;
}
set { _bar = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
所以,基本上,我只在调用getter并且字段仍然为null时初始化任何字段.我认为这可以通过不初始化任何地方没有使用的任何属性来减少过载.
ETA:我这样做的原因是我的类有几个属性返回另一个类的实例,而这个属性又具有更多类的属性,依此类推.调用顶级类的构造函数随后将调用所有这些类的所有构造函数,而不是总是需要它们.
除个人偏好外,是否有任何反对这种做法的反对意见?
更新:我已经考虑了很多关于这个问题的不同意见,我将坚持我接受的答案.但是,我现在对这个概念有了更好的理解,我能够决定何时使用它,何时不能.
缺点:
优点:
大多数缺点不适用于我当前的库,但是我必须测试"微优化"是否实际上是在优化任何东西.
最后更新:
好的,我改变了答案.我最初的问题是这是否是一个好习惯.我现在确信它不是.也许我仍会在我当前代码的某些部分使用它,但不是无条件的,绝对不是所有的时间.因此,在使用它之前,我会失去习惯并思考它.感谢大家!
我有时会在getter的属性中看到缩写.例如这两种类型:
public int Number { get; } = 0
public int Number => 0;
Run Code Online (Sandbox Code Playgroud)
如果这两者之间有任何差异,有人可以告诉我.他们的表现如何?它们都是只读的吗?
我一直在努力让自己的头脑能够吸引人并且不会陷入其中.我已经阅读过JavaScript Getters and Setters和Defining Getters and Setters而且还没有得到它.
有人可以明确说明:
我需要获取具有特定注释的字段的值,因此使用反射我可以获得此字段对象.问题是这个字段将永远是私有的,虽然我事先知道它总是有一个getter方法.我知道我可以使用setAccesible(true)并获取其值(当没有PermissionManager时),但我更喜欢调用其getter方法.
我知道我可以通过查找"get + fieldName"找到该方法(虽然我知道例如布尔字段有时被命名为"is + fieldName").
我想知道是否有更好的方法来调用这个getter(许多框架使用getters/setters来访问属性,所以也许他们以另一种方式做).
谢谢
您使用什么约定来评论getter和setter?这是我一直想知道的事情,例如:
/**
* (1a) what do you put here?
* @param salary (1b) what do you put here?
*/
public void setSalary(float salary);
/*
* (2a) what do you put here?
* @return (2b)
*/
public float getSalary();
Run Code Online (Sandbox Code Playgroud)
我总是发现我为1a/b和2a/b编写完全相同的东西,例如1a)设置雇员的工资,1b)雇员的工资.这似乎是多余的.现在我可以看到更复杂的东西,你可以在(a)部分写更多内容,给出上下文,但对于大多数的getter/setter,那里的措辞几乎完全相同.
我只是好奇,如果对于简单的getter/setter,只需填写(a)部分或(b)部分即可.
你怎么看?
getter ×10
java ×5
setter ×5
c# ×3
coding-style ×2
oop ×2
abstraction ×1
accessor ×1
android ×1
comments ×1
el ×1
javadoc ×1
javascript ×1
jsf ×1
performance ×1
reflection ×1
shorthand ×1