簡體   English   中英

傳遞和設置布爾值-Java / Android

[英]Passing and setting booleans - Java/Android

我有一個像這樣的課程:

public class Achievements(){

    boolean score100_Earned_Offline;
    boolean score1000_Earned_Offline;

    final String score100 = "xxxxxxxxxx" //where xxxxxxxxxx would be replaced with the achievement's Google Play Games ID
    final  String score1000 = "xxxxxxxxxx" //where xxxxxxxxxx would be replaced with the achievement's Google Play Games ID
}

在我的Game類中,我每隔一個滴答檢查一次成就狀態,並按需要對它們進行操作(假設所有方法都是有效的和已定義的-減少該方法以提供問題所需的代碼)..... ..

public class Game(){

    public void checkAchievements(Achievements achievements){

        if (score>=100){
            unlockAchievement(achievements.score100, achievements.score100_Earned_Offline);     
        }

        if (score>1000){
            unlockAchievement(achievements.score100, achievements.score1000_Earned_Offline);  
        }
    }

    public void unlockAchievement(String achievementToUnlock, boolean thisAchievementOfflineFlag){

        //If user is signed in, then we are ready to go, so go ahead and unlock the relevant achievement....
        if (checkSignedIn()){
            Games.Achievements.unlock(getApiClient(), achievementToUnlock);
        //Otherwise, I want to do is set the relevant flag to true so it can be checked when the user does eventually log in
        else{
            thisAchievementOfflineFlag=true;
        }
    }
}

傳遞價值

在“ unlockAchievement”方法中,如果用戶未登錄,則布爾值“ thisAchievementOfflineFlag”的確設置為true,但是,它不會影響最初發送到該方法中的實際布爾值(如您所見,已定義)在我的“成就”課程中)。 我猜這是因為Java是按值傳遞,因此正在創建僅在方法內部有效的變量的本地副本。 我也嘗試過使用布爾型 (包裝類),但是得到了相同的結果。

其他實現此目的的方法?

我目前已經設置好了,因此我可以將每個成就定義為一個枚舉,以便每個成就都有自己的boolean標志副本。 但是,我知道我們不建議在Android中使用枚舉,因此,如果缺少更好的方法,我寧願避免使用它們。

請注意,我不想,如果支票或switch語句,因為這是發生在一個游戲循環使用。

任何建議表示贊賞

這是因為Java的Boolean(例如String)實現出於安全原因是不變的。 您可以在這里看到它: http : //www.explain-java.com/is-string-mutable-in-java-why-wrapper-classes-immutable-in-java/

您可以通過為該布爾值引入對象包裝來解決您的問題:

public class BooleanWrapper {

    private boolean value;

    public void set(boolean value) {
        this.value = value;
    }

    public boolean get() {
        return value;
    }
}

現在,此對象引用將按值傳遞,但仍指向堆上的同一BooleanWrapper對象。 您可以簡單地使用getter和setter來更改內部布爾值。

然后您的代碼將變為:

public void unlockAchievement(String achievementToUnlock, BooleanWrapper thisAchievementOfflineFlag){
    if (checkSignedIn()){
        Games.Achievements.unlock(getApiClient(), achievementToUnlock);
    else {
        thisAchievementOfflineFlag.set(true);
    }
}

Java是按值傳遞的:

當您傳遞boolean值時,您肯定會按值傳遞它,而它是原始類型。 當您傳遞Boolean ,您會認為它是一個對象並且可以更改其狀態,但是實際上您不能這樣做,因為Boolean是作為不可變對象實現的( 如上所述 )。 您只需閱讀java.lang.Boolean的代碼即可確認這一點。

但是,從某種意義上說,如果您創建自己的包裝器類,則可以控制是以不可變還是可變的方式實現它。 我編寫的BooleanWrapper可讓您更改該對象的狀態。 當您將一個這樣的對象傳遞給方法時,它會按值傳遞。 這意味着將創建另一個引用,但它指向堆上的同一對象(請參見下圖)。

在此處輸入圖片說明

您可以使用AtomicBoolean ,它具有按引用傳遞的語義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM