2009-08-28 4 views
4

J'ai une classe appelée ArionFileExtractor dans un fichier .java du même nom.les constructeurs peuvent-ils réellement retourner des chaînes?

public class ArionFileExtractor { 

public String ArionFileExtractor (String fName, String startText, String endText) { 
    String afExtract = ""; 
    // Extract string from fName into afExtract in code I won't show here 
    return afExtract; 
} 

Cependant, lorsque je tente d'invoquer ArionFileExtractor dans un autre fichier .java, comme suit:

String afe = ArionFileExtractor("gibberish.txt", "foo", "/foo"); 

NetBeans me informe qu'il ya des types incompatibles et que java.lang.String est nécessaire. Mais j'ai codé ArionFileExtractor pour retourner le type de chaîne standard, qui est java.lang.string.

Je me demande, mon constructeur ArionFileExtractor peut-il légalement retourner une chaîne?

J'apprécie beaucoup tous les conseils ou les indications sur ce que je fais mal ici.

+3

Je pense que vous devriez en lire un peu plus sur la programmation orientée objet. On dirait que vous ne comprenez pas le concept, puisque vous écrivez une classe pour une simple tâche String. – stefita

+0

Merci pour votre suggestion. Je vais revenir aux livres. – elwynn

+0

@stefita, en Java, puisque tout est une classe, si tout ce dont vous avez besoin est une méthode statique, vous devez toujours l'enrouler autour d'une classe, même si ce n'est pas vraiment un objet au sens OO. – Yishai

Répondre

15

Constructors créer des objets, ils ne renvoient pas des données.

+1

Un constructeur est une méthode sans type de retour spécifié (pas même vide) et avec un identifiant identique au nom de la classe. Si vous renvoyez quoi que ce soit, vous n'écrivez pas un constructeur. Les constructeurs sont appelés avec le mot clé 'new', donc si vous essayez d'utiliser un constructeur existant sans utiliser' new', vous vous trompez. HTH. –

+0

C'est un bon point, vous ne pouvez pas dire qu'il retourne réellement une instance du nouvel objet créé. Réponse simple, bonne pour votre réputation :-) – LB40

+1

Si vous voulez être pédant à ce sujet, le constructeur ne retourne rien, mais il évalue une référence lorsqu'il est assigné à une variable.: P –

0

n ° Un constructeur ne retourne vraiment rien. Au lieu de cela, il construit l'objet en question.

Il semble que vous voulez une méthode utilitaire ici:

public class Whatever { 
    public static String doStuff(String s) { 
     return s; 
    } 
} 
2

Le constructeur n'est pas une méthode régulière. Il renvoie toujours l'instance de la classe à laquelle il appartient. Dans votre exemple, ArionFileExtractor. Il n'y a aucun moyen de retourner une autre instance.

Notez que vous ne pouvez pas spécifier explicitement le type de retour pour le constructeur ni utiliser le mot-clé return (illégal dans ce contexte).

+0

a Un constructeur ne renvoie rien, c'est la nouvelle expression (Class Instance Creation Expression) qui renvoie l'instance. ((également dans le code byte le constructeur renvoie void)) –

1

Le constructeur peut uniquement renvoyer l'instance de sa classe. Il ne peut pas retourner String. Par exemple, si vous avez la classe SampleClass, le constructeur peut renvoyer uniquement l'objet de la classe SampleClass.

+0

Un constructeur ne retourne rien. Il initialise les données. –

5

Un constructeur ne peut renvoyer qu'une instance d'objet qu'il a construit - sinon vous n'avez aucune référence à laquelle vous pouvez vous accrocher à l'objet que vous venez de créer! Si vous voulez faire un appel « utilitaire », envisager une méthode statique:

public class ArionFileExtractor { 
    public static String getFileContents(String fName, String startText, String endText) { 
     String afExtract = ""; 
     // Extract string from fName into afExtract in code I won't show here 
     return afExtract; 
    } 
} 

qui peut être invoqué à l'aide

ArionFileExtractor.getFileContents(...) 
+0

+1 pour l'indice d'une méthode statique. – elwynn

+0

Remplacez le :: par un. et vous êtes tous ensemble, puisque c'est Java. :) – crunchdog

+0

En fait 'ArionFileExtractor.getFileContents (...)' en Java (qui n'utilise pas :: pour quoi que ce soit). Mais +1 de toute façon. –

9

Votre méthode, ArionFileExtractor(), n'est pas un constructeur. Les consutructeurs n'ont pas de types de retour et ressemblent à ceci:

public ArionFileExtractor (String fName, String startText, String endText) { 
    //... 
} 

Notez l'absence d'un type de retour.

+0

+1 pour le code! – elwynn

1

Non, il ne devrait pas être en mesure de retourner légalement une chaîne. Je ne sais pas pourquoi Netbeans ne s'est pas contenté de te barbouiller quand tu as essayé de le faire. Peut-être qu'il a essayé de le compiler comme une sorte de méthode statique. Les constructeurs n'ont généralement pas de types de retour dans le code, car lorsqu'ils sont compilés, ils sont assignés pour renvoyer une instance de la classe qu'ils construisent.

Le plus facile (mais pas nécessairement la meilleure) façon d'adapter votre code serait d'avoir un constructeur vide et tourner le constructeur en cours dans une méthode statique comme ceci:

public class ArionFileExtractor { 

private ArionFileExtractor() {} 

public static String ExtractFile(String fName, String startText, String endText) { 
    String afExtract = ""; 
    // Extract string from fName into afExtract in code I won't show here 
    return afExtract; 
} 
} 

Le constructeur privé, il fait en sorte que ArionFileExtractor ne peut être utilisé que de façon statique et ne peut pas être instancié. Ensuite, lorsque vous l'utilisez-vous simplement ceci:

String afe = ArionFileExtractor.ExtractFile("gibberish.txt", "foo", "/foo"); 

attention, en utilisant des classes statiques est parfois considéré comme une mauvaise forme - en fonction de la situation. Il pourrait donc être utile d'essayer et de trouver une autre façon de le faire.

+0

+1 pour un commentaire extrêmement utile. – elwynn

2

Java compilateur traite ArionFileExtractor comme une méthode d'instance,

String afe = new ArionFileExtractor().ArionFileExtractor("gibberish.txt", "foo", "/foo"); 
4

Autant que cela est surprenant, le code que vous avez fait a un défaut, aucun constructeur argument. ArionFileExtractor est une méthode qui renvoie une chaîne. J'ai été très surpris quand j'ai vu le code pour la première fois, car c'est certainement un accident (comme dans votre cas).

Vous pouvez appeler la méthode que vous (juste pour montrer c'est le cas) avec:

String afe = new ArionFileExtractor().ArionFileExtractor("gibberish.txt", "foo", "/foo"); 

Qu'est-ce que ça sonne vraiment comme vous essayez d'obtenir à une méthode statique, pas une classe du tout.

public class ArionFileExtractor() { 
     public static String extract(String fName, String startText, String endText) { 
      String afExtract = ""; 
       // Extract string from fName into afExtract in code I won't show here 
      return afExtract; 
     } 
} 

que vous appelez avec:

String afe = ArionFileExtractor.extract("gibberish.txt", "foo", "/foo"); 
+0

+1 pour augmenter le problème de constructeur par défaut! – elwynn

0

Yes.Only chaîne constructeur de la classe peut retourner des objets chaîne hors de lui;).

Cela signifie essentiellement que le constructeur crée l'objet de la classe que vous appelez.

-1

Vous devez d'abord créer l'objet (en utilisant le constructeur) et ensuite faire des choses avec.

Java a très peu de raccourcis intelligents. I

Questions connexes