2015-12-29 13 views
5

Come said in JVMS8:Qual è lo scopo del tipo `boolean` in JVM?

Anche se la Java Virtual Machine definisce un tipo booleano, fornisce solo supporto molto limitato per esso. Non ci sono istruzioni Java Virtual Machine solo dedicate alle operazioni su valori booleani. Al contrario, le espressioni nel linguaggio di programmazione Java che operano su valori booleani vengono compilate per utilizzare i valori del tipo di dati int Java Virtual Machine.

In effetti, questi due metodi:

boolean expr1(boolean a, boolean b) { 
    return a || b; 
} 

int expr2(int a, int b) { 
    return ((a != 0) || (b != 0)) ? 1 : 0; 
} 

produrrà stesso codice byte (ad eccezione firma del metodo)

boolean expr1(boolean, boolean); 
    Signature: (ZZ)Z 
    Code: 
     0: iload_1  
     1: ifne   8 
     4: iload_2  
     5: ifeq   12 
     8: iconst_1  
     9: goto   13 
     12: iconst_0  
     13: ireturn  

    int expr2(int, int); 
    Signature: (II)I 
    Code: 
     0: iload_1  
     1: ifne   8 
     4: iload_2  
     5: ifeq   12 
     8: iconst_1  
     9: goto   13 
     12: iconst_0  
     13: ireturn  

Quindi, non capisco il motivo per cui lo fa JVM necessità boolean tipo comunque? Solo per il controllo runtime delle firme dei metodi?

+0

È possibile scrivere codice molto più pulito con un tipo 'boolean' piuttosto che con un' int' che emula un 'booleano'. –

+0

@MickMnemonic Sure. Ma non parlo del linguaggio 'java', ma di' JVM' che non sa nulla del linguaggio 'java'. – Andremoniy

+0

@sidgate La domanda non riguarda invece l'uso di '0/1'. La domanda riguarda, perché 'JVM' deve dichiarare un tipo speciale di tipo' booleano', non solo 'int', mentre non ha istruzioni speciali per' int'. Quindi non interrogarsi sulle specifiche 'java', ma sull'architettura' 'JVM'. – Andremoniy

risposta

5

Come minimo è necessario per il sovraccarico del metodo di manutenzione. Supponiamo di avere due metodi nella stessa classe

boolean a(boolean x) {...}

e

boolean a(int x) {...}

Possono avere diversa logica interna, quindi nel codice byte devono essere distinti dai loro firme.

+0

Anche il tipo restituito fa parte della firma per la JVM . –