大家好,我想把下面的代碼放在一個與ui執行緒不同的新執行緒中,但是android studio給出了一個錯誤,說這個變數需要被宣告為final。請問我怎樣才能在不宣告變數為final的情況下啟動一個新的執行緒。
public void checkUpTaking(int position, int rowImpact, int takenPawn) { /toaken pawn: -1=棕色,1=白色
if (position > 10) { //如果你試圖從最后一行取走 - 陣列出界。
if (position % 5 ! = 0 && playableTile[position - 1 - 4 - rowImpact].getIsTaken()== takenPawn &&
playableTile[position - 1 - 9].getIsTaken() == 0) {
checkTreeNodes(position, position - 9, position-4-rowImpact); //checking possible mandatory moves before click pawn.
}
if ((position - 1) % 5 ! = 0 && playableTile[position - 1 - 5 - rowImpact].getIsTaken()== takenPawn &&
playableTile[position - 1 - 11].getIsTaken() == 0) {
checkTreeNodes(position, position - 11, position-5-rowImpact) 。
}
}
我試圖實作類似的東西,而不使我的變數成為最終變數
。 public void checkUpTaking(int position, int rowImpact, int takenPawn) { /toaken pawn: -1=棕色,1=白色
new Thread(new Runnable){
@Override
public void run() {
if (position > 10) { // if you'll try to take from the last row - array out of bounds.
if (position % 5 ! = 0 && playableTile[position - 1 - 4 - rowImpact].getIsTaken()== takenPawn &&
playableTile[position - 1 - 9].getIsTaken() == 0) {
checkTreeNodes(position, position - 9, position-4-rowImpact); //checking possible mandatory moves before click pawn.
}
if ((position - 1) % 5 ! = 0 && playableTile[position - 1 - 5 - rowImpact].getIsTaken()== takenPawn &&
playableTile[position - 1 - 11].getIsTaken() == 0) {
checkTreeNodes(position, position - 11, position-5-rowImpact) 。
}
}
}
}).start()。
}
uj5u.com熱心網友回復:
你在這里展示的代碼不需要final,至少在 Java 8 中編譯時,它允許匿名類有效參考final變數。
你無法參考匿名類中的引數的唯一原因是如果有代碼重新分配它們(無論是在匿名類內部還是外部):如果沒有重新分配,這些引數將被視為有效的最終變數。
如果在這個方法中還有其他的代碼可以重新分配這些變數,那么簡單的答案就是將你所展示的代碼或者你沒有展示的代碼提取到另一個方法中去:
public void checkUpTaking(int position, int rowImpact, int takenPawn) {
///創建執行緒的代碼。
restOfTheMethodBody(position, rowImpact, takenPawn)。
}
private void restOfTheMethodBody(int position, int rowImpact, int takenPawn) {
//需要更新 position/rowImpact/takenPawn 的代碼。
或者你可以宣告額外的變數,其值與引數相同,并在執行緒中參考這些變數:
int positionCopy = position;
//etc.。
或者你可以用一個命名的類來宣告Runnable,并給它一個建構式和顯式欄位:
class CheckUpTakingRunnable implements Runnable {
private final int position;
//etc.
CheckUpTakingRunnable(int position /* etc */) {
this.position = position;
}
/* run() method.。
uj5u.com熱心網友回復:
你不必將position、rowImpact或takenPawn作為最終結果。 但是你不能在你的new Thread(new Runnable().)之前改變它。 如果你必須這樣做,它就必須是最終的。為什么呢?這里有一個詳細的描述。https://blog.brendanlacanette.com/2015/08/variable-is-accessed-within-inner-class.html
為了解決這個問題,你有一些可能性:
制作一個新的最終變數,并在你的Runnable中使用它
final int finalPosition = position;
把它們放在一個陣列中,并在你的Runnable中使用例如params[0]。 我不喜歡這種方法
int[] params = new int[]{position, rowImpact, takenPawn};為你的引數創建一個包裝物件
//作為自己的類,甚至作為內部類。
public class CheckupParameters
{
public CheckupParameters(int position, int rowImpact, int takenPawn)。
{
this.position = position;
this.rowImpact = rowImpact;
this. takenPawn = takenPawn;
int position;
int rowImpact;
int takenPawn;
}
///在你的執行緒之前...
CheckupParameters checkupParameters = new CheckupParameters(position, rowImpact, takenPawn)。
//在你的Runnable中,你可以訪問
params.position
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/325318.html
標籤:
