I have a method that uses a SwingWorker. Part of the code is shown below:
public class mySocket {
public void writePacket(final String packet) {
// schedules execution on the single thread of the executor (so only one
// background operation can happen at once)
//
executor.execute(new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
// called on a background thread
System.out.println("writing out this packet->" + packet + "
<-");
out.println(packet);
String thePacket = readPacket();
return thePacket;
}
..................
我的问题是关于writePacket方法的签名。变量数据包必须声明为final或编译器抱怨,因为SwingWorker是一个内部类。这引发了以下关于如何以及何时可以为此变量赋值的问题:
提前感谢您的帮助。
埃利奥特
答案 0 :(得分:4)
<强> 1。对我而言,最终意味着变量只能被赋值一次。但由于声明是方法签名的一部分,我不知道这在这种情况下意味着什么。
这只是意味着您无法将新值重新分配给变量packet
。
<强> 2。我总是假设在实例化类时为最终变量赋值,但是在调用方法时分配它。传递给方法的变量是否也需要声明为final并在类的构造函数中赋值以使其起作用?
您也可以拥有本地最终变量。适用相同的规则,但它们与构造函数/ this
引用无关。
<强> 3。我可以使用不同的数据包值调用该方法多次,或者因为变量被声明为final,这是否意味着如果我想用不同的值调用该方法,我需要为变量数据包的每个新值重新实例化该类? 强>
您可以使用不同的值多次调用该方法。 packet
变量就像一个局部变量。和否,您不需要为每个值/调用重新实例化该类。
进一步阅读:
答案 1 :(得分:1)
内部类只能引用最终变量,因为想要的变量实际上作为参数传递给内部类ctor。如果变量不是final,并且在创建内部类之后更改,则它将不再保留当前但前一个变量。为了避免这种陌生感并保持简单,变量/参数必须是最终的,才能让内部类读取。
答案 2 :(得分:1)
对我而言,最终意味着只能为变量赋值 一旦。但因为声明是签名的一部分 方法,我不知道这意味着什么。
这意味着同样的事情,你无法重新分配变量。
// this compiles
public void foo(String bar){
bar = "xyz";
}
// this doesn't
public void foo(final String bar){
bar = "xyz";
}
我总是假设最终变量在分配值时 该类已实例化,但在此处调用该方法时会分配该类。
不,局部变量也可以是最终的,参数也是。每个范围(块或方法级别)分配一次。
传递给方法的变量是否也需要 声明final并在类的构造函数中为此指定 工作?
不,这完全不相关
我可以使用不同的数据包值多次调用该方法 或者因为变量被声明为final,这是否意味着如果我 想要用不同的值调用方法,我需要重新实现 变量包的每个新值的类?
不,见上文。它是每个方法调用的新变量。
答案 3 :(得分:1)
对我而言,最终意味着变量只能被赋值一次。但由于声明是方法签名的一部分,我不知道这在这种情况下意味着什么。
同样的事情。这意味着您不能将新值重新分配给包含参数的局部变量(无论如何这被认为是不好的做法)。
我总是假设在实例化类时为最终变量赋值,但是在调用方法时分配它
第一部分适用于最终实例变量,而不适用于局部变量。
但是这个想法是一样的:他们需要被分配一个值,它只能发生一次。
我可以使用不同的数据包值调用该方法多次,或者因为该变量被声明为final,这是否意味着如果我想使用不同的值调用该方法,我需要为每个新值重新实例化该类变量包?
你可以多次打电话。声明为final的参数对方法的代码调用没有影响(仅用于其实现)。