2014-05-07 2 views
-1

En C++, autant que je sache, il est bon d'ajouter un paramètre const à ces variables qui ne vont pas changer et à ces méthodes, qui renvoient des valeurs, par exemple:Utilisation correcte du paramètre final en Java

bool ExpenseManager::checkCategory(const string &userName, const string &categName) const{} 

Ma question: est-il une bonne pratique d'utiliser final en Java comme const en C++ et déclarer des méthodes spécifiques et/ou variables final (comme pour les valeurs qui sont transmises pour le constructeur (public Something(final String haha))

+0

duplication possible de [Pourquoi marquer les variables locales et les paramètres de la méthode comme "final" en Java?] (Http://stackoverflow.com/questions/316352/why-would-one-mark-local-variables-and -method-parameters-as-final-in-java) – JonK

Répondre

5

Notez que la déclaration d'un paramètre final en Java est un détail de mise en œuvre tandis qu'un paramètre const en C/C++ modifie la signature de la méthode! final signifie seulement que la variable ne changera pas. Tout objet référencé par la variable CAN peut changer. Donc, final signifie rien pour l'appelant de la méthode. En revanche, un paramètre const définit un contrat avec l'appelant: La méthode promet de ne pas modifier les données transmises via le paramètre. Avec Java, vous ne pouvez pas créer un tel contrat, vous devez donc vous rabattre sur des objets immuables ou des copies défensives.

Pour en revenir à votre question: Puisque final est un détail d'implémentation, cela n'a pas d'importance quand on considère les interfaces. C'est plutôt une question de goût. Certaines personnes, en particulier celles qui viennent d'un langage fonctionnel aiment final, puisqu'elles déclarent qu'une variable ne devrait être modifiable que lorsqu'elle est réellement mutée quelque part. D'autres n'aiment tout simplement pas le mot-clé ajouté qui ajoute du bruit visuel.

Habituellement, cette décision est prise au niveau d'un projet: utilisez final partout dans le projet ou nulle part. Chaque développeur sur le projet devrait faire la même chose ou le code semblera incohérent.

1

Le final mot-clé a diff significations différentes lorsqu'elles sont utilisées sur des méthodes et sur des paramètres de méthode.

  • Lorsqu'une méthode est utilisée, cela signifie que cette méthode ne peut pas être annulée.
  • Lorsque sur un paramètre de méthode, cela signifie que la méthode ne peut pas
    modifier la valeur de ce paramètre dans son corps.

EDIT:

Dans certains cas, les forces du compilateur vous de les déclarer finale. Voici un exemple (c'est un code DAO typique). Donc les gens le font habituellement seulement quand le compilateur les force à le faire.

public List<Process> getProcesses(final Integer uid, final String status) { 
    return getHibernateTemplate().executeFind(new HibernateCallback() { 
     public Object doInHibernate(Session session) 
       throws HibernateException, SQLException 
     { 
      StringBuilder sbQuery = new StringBuilder 
      ("select * from [process] where [uid] = :u and [status] = :s"); 

      SQLQuery query = session.createSQLQuery(sbQuery.toString()); 

      query.addEntity(Process.class); 

      query.setParameter("u", uid); 
      query.setParameter("s", status); 

      List l = query.list(); 
      return (List<Process>)l; 
     } 
    }); 
} 
+0

D'accord, que je comprends. C'est juste que je n'ai jamais vu un morceau de code, où les variables passées seraient déclarées comme finales dans la méthode (même si elles ne changent jamais). – user3178137

+0

@ user3178137 Je ne suis pas sûr de la sémantique de C++, mais je voudrais juste ajouter qu'en Java, 'final' sur les variables de référence signifie simplement que vous ne pouvez pas réaffecter la variable. Vous êtes toujours libre de changer l'objet auquel la variable fait référence. En outre, 'final' sur les méthodes statiques signifie que vous ne pouvez pas masquer la méthode, car les méthodes statiques ne peuvent pas être remplacées en premier lieu. – awksp

+0

@ user3178137 Ajout d'un exemple et de quelques notes supplémentaires. –

0

Oui, c'est. L'Eclipse IDE dispose de paramètres de nettoyage de code qui le feront pour vous automatiquement, bien que je ne l'utilise que pour les paramètres de méthode.

0

Vous devez être prudent lors de l'utilisation final mot-clé dans java

1.Applying final mot-clé aux variables dans lesquelles on ne peut pas réattribuer la valeur à Thet variables

2.Dans une méthode decared comme final cette méthode ne peut pas substitué

3.Si la classe déclarée comme final qui ne peut pas être étend (benifit clé de l'héritage sera lossed)

What i can say is Think before using `final` keyword 
-1

finale avec des variables lorsque vous voulez faire inchangeable comme en java lorsque vous passez variable, il est passé par référence dans ce les changements de cas seront reflétés dans la portée à partir de laquelle la fonction est appelée.

+1

D'abord, toutes les variables sont passées par valeur (vous avez raison en ce que la valeur d'une référence 'Object' est la référence' Object'). Cette réponse rendra la référence immuable, mais pas le 'Object' lui-même. Par exemple, le fait de passer en paramètre un 'List final al' ne rendra pas les valeurs de la liste immuables (par exemple, 'al.clear();' videra toujours le 'Object' de l'appelant). –

0

Déclaration d'un paramètre de procédé finale a les conséquences suivantes:

  • Le procédé ne peut pas changement du paramètre de procédé pour pointer vers une autre référence.
  • Le procédé CAN modifier le paramètre de méthode i.e. changer l'état de l'objet étant désigné par le paramètre (modifier les variables d'instance)

Je vais illustrer cela par l'exemple suivant. Supposons que j'ai une classe pour représenter un employé:

class Employee 
{ 
    public String name; 
    public Integer id; 
} 

Cas 1:

public void test(final Employee emp) 
    { 
     emp = new Employee(); //Invalid since you are changing the reference 
    } 

Cas n ° 2:

public void test(final Employee emp) 
    { 
     emp.name = "John Doe"; //Valid 
    } 

Ceci est différent d'un paramètre const en C++ qui a également empêche la méthode d'apporter des modifications à l'état de l'objet/référence en cours de transmission.