有什么理由这样做:
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
Run Code Online (Sandbox Code Playgroud)
而不是这个?
private static Logger logger = LoggerFactory.getLogger(Main.class);
Run Code Online (Sandbox Code Playgroud)
我不承认一个人的语法上的好处是什么.两者似乎都很好.
如果我在 Java 中有一个具有不可变成员的类,我会这样做:
class MyClass {
private final String name;
private final int id;
myClass(String name, int id) {
this.name = name;
this.id = id;
}
String getName() { return name; }
int getId() { return id; }
}
Run Code Online (Sandbox Code Playgroud)
在 Progress-4GL 中,您通常会看到这样的内容:(请不要讲匈牙利符号。我也讨厌它,但它在 Progress 社区中很常见,所以我只接受它。)
CLASS MyClass :
DEFINE VARIABLE mcName as CHARACTER NO-UNDO.
DEFINE VARIABLE miId as INTEGER NO-UNDO.
CONSTRUCTOR PUBLIC MyClass(INPUT ipcName AS CHARACTER,
INPUT ipiId AS INTEGER):
ASSIGN mcName = ipcName
miId = ipiID.
END. /* constructor(char,int)*/
END …Run Code Online (Sandbox Code Playgroud) Local Inner类不仅可以访问实例变量,还可以访问方法的局部变量(在其中定义它们),但必须声明局部变量final.
为什么final在这种情况下必须声明局部变量?
我想知道你是否可以用C#编写final(Java)函数/方法.我能看到一些C#最终函数/方法的例子吗?
有相反的问题在这里.
最终变量.我已经阅读了本网站上可以找到的所有内容,以及其他内容,我几乎了解它们,但我仍然有点困惑.
所以,我知道为什么我们将变量声明为final的官方答案:它锁定变量并阻止它被重新初始化.我的问题是这些:
如果无法重新初始化,它的价值仍然可以改变吗?例如:
final int a = 1;
a = a + 1;
Run Code Online (Sandbox Code Playgroud)
这种代码是否仍然有用,或者"final int a"会永久锁定值1吗?
如果int a即使在宣布最终值之后仍然可以改变上述值,那么最终的意义何在?
我想问题2是我最大的问题.我一直看到关于它如何锁定变量的所有这些解释,有些人甚至说他们将大部分变量声明为最终变量,但这样做的动机对我来说没有意义.
假设我有一个数组
public static final String[] fooArray ={ Foo.a, Foo.b, Foo.c };
Run Code Online (Sandbox Code Playgroud)
其中Foo.ab和c是静态最终字符串.
我仍然可以做这样的事情fooArray[0] = "taco";,并最终{ taco, Foo.b, Foo.c }为fooArray的内容是什么?
如果是这样,是否会将数组设为私有,并使用getter来生成数组的副本以Arrays.copyOf解决此问题?
View.OnClickListener handleOnClick(ToggleButton mButton, boolean mBoolean) {
return new View.OnClickListener() {
public void onClick(View v) {
mBoolean = !mBoolean;
updateUi(mButton, mBoolean);
}
};
}
Run Code Online (Sandbox Code Playgroud)
mBoolean和mButton"是从内部类中访问的,需要声明为final"
但是当我这样做时,我不能做mBoolean =!mBoolean,因为它说我无法改变最终变量.
我有这个代码,我存储两个集合,然后添加一个事件监听器(这里没有lambda - 我需要坚持Java 7;)).
// rri is a ReturnRequestInterface
final Collection<BigDecimal> selectedItems = rri.getSelected();
final Collection<BigDecimal> unselectedItems = rri.getUnSelected();
rri.addInformationChangeEventListener(new ComponentInformationChangeListener() {
@Override
public void informationChange(RequestChangeEvent event) {
ReturnRequestInterface source = (ReturnRequestInterface) event.getSource();
boolean debug1 = source.getSelected().containsAll(selectedItems);
boolean debug2 = source.getUnSelected().containsAll(unselectedItems);
}
});
Run Code Online (Sandbox Code Playgroud)
我最初调试了这个,并正确设置了集合.它不包含任何对象,因为代码刚刚初始化.
调试监听器(由于选择了项目而触发了事件)让我感到困惑.布尔debug1和debug2都是真的,因为收集selectedItems和unselectedItems根据项目选择更新.因此,事件源集合包含与声明的最终集合(selectedItems,unselectedItems)相同的项目.
这两个宣布的最终收藏品是否必须保持不变?
我正面临Android Studio的以下问题
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final int numeroHomem = 0;
final int numeroMulher = 0;
final int numeroPessoas = 0;
final TextView campoTexto = (TextView) findViewById(R.id.pessoas);
final Button botaoHomem = (Button) findViewById(R.id.homem);
final Button botaoMulher = (Button) findViewById(R.id.mulher);
final Button botaoReset = (Button) findViewById(R.id.reset);
botaoHomem.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
numeroHomem++;
numeroPessoas++;
String mensagem = Integer.toString(numeroPessoas);
campoTexto.setText("Total: " + mensagem + " pessoas");
botaoHomem.setText(Integer.toString(numeroHomem));
}
});
} }
Run Code Online (Sandbox Code Playgroud)
错误:无法为最终变量numeroHomem …
我想知道在Java中是否可以只分配一次变量。我知道这里有final关键字,但我想获得相同的结果而不必在构造函数中设置值。我想在构造函数之外设置它,因为我还不知道该值。