2010-11-04 4 views
5
class A{ 

A(int i){ 
} 
} 

A obj=new A(1); 

lors de la création d'un objet si l'objet Nombre positif doit être créé. A obj = nouveau A (-1); Si des nombres négatifs sont passés, l'objet ne doit pas être créé.Création de la référence null

Comment adjsut le constructeur pour ce faire

Répondre

9

Si vous ne voulez pas un objet à créer, ne pas appeler new. L'appel new crée toujours un objet, même s'il est ensuite supprimé en raison d'une exception. Si vous souhaitez simplement éviter à l'appelant de de recevoir un objet à la suite de l'appel du constructeur, vous pouvez demander à votre constructeur de lancer une exception. Si vous voulez juste recevoir une référence null, vous ne pouvez pas le faire dans un constructeur.

Cependant, vous pourriez avoir une méthode statique au lieu, qui a ensuite conditionnellement appels new ou renvoie null:

public class A 
{ 
    public static A createIfNonNegative(int i) 
    { 
     return i < 0 ? null : new A(); 
    } 
} 
3

Vous pouvez utiliser modèle Null Object. Dans ce cas, l'objet sera créé mais avec un état logique nul.

3

Comme alternative à Jon Skeet (évidemment) excellente réponse, vous pouvez également lancer une exception du constructeur:

class A{ 

    A(int i){ 
     if(i<0) { 
      throw new NumberBelowZeroException(i); // implementation of this exception is left as an exercise 
     } 
    } 
} 

A obj=new A(1); 

De cette façon, l'objet sera construit (en tant que constructeur, en ayant été appelé, assure objet existe), mais il indiquera clairement qu'il n'est pas utilisable.

0

Il existe plusieurs approches:

  1. La logique en fonction de la valeur de i encapsulé dans le même niveau. Dans ce cas, la vérification de l'état est nécessaire, même si elle retourne null:
     
    A a = createAInstance(i); 
    if(a == null) { // do something } 
    else { // do something else } 
    
    donc en fonction de l'algorithme vous pouvez vérifier l'état au niveau où vous utilisez A a:
     
    if(i >= 0) { A a = new A(i); // do something } 
    else { // do something else } 
    
  2. La logique est mise en œuvre A seulement: utiliser Null Objet pour implémenter un stub nul pour A, et le code traitant avec une instance ne devrait pas sentir la différence;
  3. la logique est mélangée: utilisez l'objet NULL comme dans 2.
Questions connexes