martedì 24 settembre 2013

Q13

Given the Greetings.properties file, containing:

HELLO_MSG = Hello, everyone!
GOODBYE_MSG = Goodbye everyone!

 
And given:

public class ResourceApp {
       public void loadResourceBundle() {
             ResourceBundle resource = ResourceBundle.getBundle("Greetings",Locale.US);
             System.out.println(resource.getObject(1));
       }
       public static void main(String[] args) {
             new ResourcesApp().loadResourceBundle();
       }
}


What is the result?


A.
Compilation fails

B.
HELLO_MSG

C.
GOODGYE_NSG

D.
Hello, everyone!

E.
Goodbye everyone!

La risposta è A.
Infatti per come è scritto quel codice non compila per due motivi :
1)      Il metodo getObject() di ResourceBundle accetta solo String.
2)      Nel new ResourcesApp() c’è un errore infatti il tipo ResourcesApp non è definito.
Se invece si considera questo altro codice, in cui ResourcesApp si sostituisce con ResourceApp (senza la s) e l’argomento al metodo getObject si cambia da 1 ad “1” si ha una corretta compilazione:
import java.util.Locale;
import java.util.ResourceBundle;

 
public class ResourceApp {
       public void loadResourceBundle() {
             ResourceBundle resource = ResourceBundle.getBundle("Greetings",Locale.US);
             System.out.println(resource.getObject("1"));
       }

       public static void main(String[] args) {
             new ResourcesApps().loadResourceBundle();
       }
}
Per testare questo codice va creato un file di proprietà Greetings :
 
con il seguente codice :
HELLO_MSG = Hello, everyone!
GOODBYE_MSG = Goodbye everyone!

 
In questo caso il codice restituisce una eccezione a Runtime perché nel file di properties non esiste una risorsa con chiave “1”:

Exception in thread "main" java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key 1

Il codice viene eseguito correttamente invece nel caso di richiamo di una chiave esistente , ad esempio  HELLO_MSG :

import java.util.Locale;
import java.util.ResourceBundle;

public class ResourceApp {
       public void loadResourceBundle() {
             ResourceBundle resource = ResourceBundle.getBundle("Greetings",Locale.US);
             System.out.println(resource.getObject("HELLO_MSG"));
       }
       public static void main(String[] args) {
             new ResourceApp().loadResourceBundle();
       }
}

in questo caso l’uscita è : Hello, everyone!.

Riferimenti:

Q12

Given:

public interface Vehicle {
       public void start();
       public void stop();
}
 
public interface Motorized {
       public void stop();
       public void slow();
}

 
public class Car implements Vehicle,Motorized {
       public void start(){};
       public void stop(){};
       public void slow(){};
}

 
What is the result of invoking Car’s stop method?

 
A.
Both vehicles and Motorized’s stop methods are invoked.

B.
Vehicles stop method is invoked.

C.
Motorized’s stop method is invoked.
 
D.
The implementation of the Car’s stop determines the behavior.

E.
Compilation fails.

 
La Risposta è D
Infatti per definizione i metodi non possono essere implementati nelle interfacce ma sono nelle classi. Quindi l’unica implementazione possibile è dentro la classe Car.

lunedì 23 settembre 2013

Q11


Given:
interface Rideable {
       public String ride() { return "riding "; };
}


class Horse implements Rideable {
       public String ride() {
             return "cantering ";
       }
}

class Icelandic extends Horse implements Rideable {
       public String ride() {
             return "tolting ";
       }
}

class Test {
       public static void main(String[] args) {
             Rideable r1 = new Icelandic();
             Rideable r2 = new Horse();
             Horse h1 = new Icelandic();
             System.out.println(r1.ride() + r2.ride() + h1.ride());
       }
}

 

What is the result?

A.
riding riding tolting


B.
riding riding cantering


C.
tolting cantering tolting


D.
tolting cantering cantering


E.
Compilation fails.


F.
An exception is thrown at runtime.


La risposta è E perché i metodi di una interfaccia possono essere solo astratti (abstract) e quindi non devono avere un corpo.

Per compilare il metodo dell’interfaccia dovrebbe essere corretto in :
public String ride() { return "riding "; };à public String ride();

Q10


You have been asked to create a ResourceBundle file to localize an application.

Which code example specifies valid keys menu1 and manu2 with values of File Menu and View Menu?

A.
<key name ="menu1">File Menu</key>
<key name ="menu1">View Menu</key>

B.
<key> menu1</key><File Menu>File Menu </value>
<key> menu1</key><File Menu>View Menu </value>

C.
menu1m File menu, menu2, view menu

D.
menu1 = File Menu
menu2 = View Menu


La risposta è D.
Infatti abbiamo bisogno di scrivere un file di properties per inserire le coppie chiave valore e la sintassi è appunto :
chiave = valore

 Un esempio di classe che legge un file di properties è :

import java.util.Enumeration;
import java.util.ResourceBundle;
public class Principale {
       public static void main(String[] args) {
             ResourceBundle rb = ResourceBundle.getBundle("ButtonLabel");
             Enumeration <String> keys = rb.getKeys();
             while (keys.hasMoreElements()) {
                    String key = keys.nextElement();
                    String value = rb.getString(key);
                    System.out.println(key + ": " + value);
             }
       }
}

e il file di properties collegato è :
menu1 = File Menu
menu2 = View Menu


che da luogo all’uscita:
menu2: View Menu
menu1: File Menu

Riferimenti :

Q9


Given:
interface Rideable {
       String ride();
}

class Horse implements Rideable {
       String ride() {
             return "cantering ";
       }
}

class Icelandic extends Horse {
       String ride() {
             return "tolting ";
       }
}

class Test {
       public static void main(String[] args) {
             Rideable r1 = new Icelandic();
             Rideable r2 = new Horse();
             Horse h1 = new Icelandic();
             System.out.println(r1.ride() + r2.ride() + h1.ride());
       }
}

What is the result?
A.
tolting cantering cantering
B.
cantering cantering cantering
C.
compilation fails
D.
an exception is thrown at runtime

Risposta C.
Tutti i metodi di una interfaccia sono automaticamente pubblici. I metodi ride() delle classi Horse e Icelandic sono invece dichiarati default , infatti non hanno modificatore.
Perciò i metodi ride() di Horse e Icelandic abbassano la visibilità del metodo ride() di Rideable.
Questo in Java e in generale nella programmazione ad oggetti non è permesso perché viola il principio di Principio di Liskov, che pretende la sostituibilità tra una superclasse (in questo caso un’interfaccia) e una sottoclasse.
Questo è esplicitamente scritto nella documentazione ufficiale del Java :
The access modifier (§6.6) of an overriding or hiding method must provide at least as much access as the overridden or hidden method, or a compile-time error occurs. In more detail:
·         If the overridden or hidden method is public, then the overriding or hiding method must be public; otherwise, a compile-time error occurs.
·         If the overridden or hidden method is protected, then the overriding or hiding method must be protected or public; otherwise, a compile-time error occurs.
·         If the overridden or hidden method has default (package) access, then the overriding or hiding method must not be private; otherwise, a compile-time error occurs.

Per capire questo concetto si prenda questo esempio :
class A {
public void myMethod() {...}
}
class B extends A {
private void myMethod() {...}
}

//...

A a = new B();
 

Istanziare una variabile di tipo A assegnandole un oggetto di tipo B è sempre possibile in Java, e su questo si basa l’ereditarietà. Ma al momento di usare il metodo myMethod() sorgono i problemi di visibilità perché il metodo è pubblico in A ma in realtà è la variabile è un oggetto di tipo B e B non ha il metodo pubblico.

Riferimenti:



giovedì 19 settembre 2013

Q8

Given:

public class SleepOtherThread {
       public static void main(String[] args) throws InterruptedException {
             Runnable r = new Runnable() {
                    public void run() {
                      System.out.print(Thread.currentThread().getName()); 
                    }
             };
             Thread t1 = new Thread(r, "One ");
             t1.start();
             t1.sleep(2000);
             Thread t2 = new Thread(r, "Two ");
             t2.start();
             t2.sleep(1000);
             System.out.print("Main ");
       }
}
What is the most likely result?

A.
Main One Two

B.
Main Two One

C.
One Two Main

D.
One Main Two

E.
Two Main One
 
Risposta: C
One Two Main

Per capire cosa succede nel tempo vediamo uno schema. Le frecce vanno nel senso del tempo crescente: