Quand utiliser Long vs long en java?


Ci-dessous est mon interface -

public interface IDBClient {
    public String read(ClientInput input);
}

Ceci est mon implémentation de l'interface -

public class DatabaseClient implements IDBClient {

    @Override
    public String read(ClientInput input) {

    }
}

Maintenant, j'ai une usine qui devient l'instance de DatabaseClient, ce

IDBClient client = DatabaseClientFactory.getInstance();
....

Maintenant, je dois faire un appel à la méthode read de mon DatabaseClient qui accepte le paramètre ClientInput et ci-dessous est la classe pour le même. Ce cours n'a pas été écrit par moi donc c'est la raison pour laquelle j'ai une question à ce sujet et je suis à peu près sûr que c'est la mauvaise façon de faire il.

public final class ClientInput {

    private Long userid;
    private Long clientid;
    private Long timeout_ms = 20L;
    private boolean debug;
    private Map<String, String> parameterMap;

    public ClientInput(Long userid, Long clientid, Map<String, String> parameterMap, Long timeout_ms, boolean debug) {
        this.userid = userid;
        this.clientid = clientid;
        this.parameterMap = parameterMap;
        this.timeout_ms = timeout_ms;
        this.debug = debug;
    }
}    

Ainsi, lorsque le client appelle la méthode read de DatabaseClient, il crée le paramètre ClientInput comme ceci, puis utilise l'usine pour obtenir l'instance de DatabaseClient, puis appelle la méthode read en conséquence.

Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("attribute", "segmentation");

ClientInput input = new ClientInput(109739281L, 20L, paramMap, 1000L, true);

IDBClient client = DatabaseClientFactory.getInstance();
client.read(input);

Énoncé Du Problème:-

  1. Donc, ma première question est la userid, clientid, timeout_ms devrait être Long objet ou simplement long dans ClientInput classe?
  2. La deuxième question que j'ai est, il pourrait être possible que le client puisse passer de fausses informations telles que negative user ids, negative client id, negative timeout valeur etc etc.. Alors où dois-je faire cette validation? Dois-je faire cette vérification de validation dans le constructeur de la classe ClientInput ou à un autre endroit? Quelle est la meilleure façon de le faire et comment dois-je faire la validation?
Author: AKIWEB, 2014-01-10

7 answers

Je ne pense pas qu'il y ait une seule réponse correcte. Quelques suggestions:

  • La plus grande différence que je vois entre long et Long dans ce contexte est que Long peut être nul. S'il y a une possibilité que vous ayez des valeurs manquantes, l'objet Long sera utile car le null peut indiquer des valeurs manquantes. Si vous utilisez des primitives, vous devrez utiliser une valeur spéciale pour indiquer manquant, ce qui va probablement être un gâchis. La vitesse ou la taille ne sont pas susceptibles d'être un problème sauf si vous êtes planification de faire un tableau d'un million de ces choses, puis sérialisation.

  • Ma préférence pour la logique de validation est de lancer une sorte d'exception ValidationException personnalisée au point où la chose pourrait échouer. Si vous créez simplement ces choses avec un constructeur, la chose la plus simple serait juste de valider là-bas, par exemple

     public ClientInput(Long userid, Long clientid, Map<String, String> parameterMap, Long timeout_ms, boolean debug) throws ValidationException {          
    
          if (userid == null) throw new ValidationException("UserId is required"); 
                ...etc, etc...
    }
    

    , Finalement, le validationException n'est utile que si vous pouvez l'attraper, à un point où vous pouvez faire quelque chose d'utile avec elle - l'écho retour à un utilisateur ou quoi que ce soit.

 14
Author: Steve B., 2015-01-08 10:55:30

long est une primitive, qui doit ont une valeur. Simple.

Long est un objet, donc:

  • il peut être null (ce qui signifie ce que vous voulez, mais "inconnu" est une interprétation commune)
  • il peut être passé à une méthode qui accepte un Object, Number, Long ou long paramètre (le dernier grâce à l'auto-déballage)
  • , il peut être utilisé un générique du type de paramètre, c'est à dire List<Long> est OK, mais List<long> est pas OK
  • , il peut être sérialisé / désérialisé via le mécanisme de sérialisation java

, utilisez Toujours la chose la plus simple qui fonctionne, donc si vous avez besoin des fonctionnalités de Long, utiliser Long sinon utiliser long. La surcharge d'un Long est étonnamment petite, mais elle est là.

 36
Author: Bohemian, 2014-01-10 02:36:16

1 Long est la partie de compteur orientée objet de long. La différence est la suivante, et elle s'applique à Float float, Integer integer etc.

  • long est un type primitif, tandis que Long est une classe Java (et donc il héritera de Object).
  • long doit être attribué avec un nombre valide, tandis que Long peut être null
  • les instances longues ne peuvent pas utiliser les avantages de OO, tandis que les instances Longues sont de vrais objets Java
  • Long est sérialisable, il sera donc très utile lorsque faire un fichier, une base de données ou un réseau IO
  • long est plus efficace que Long compte tenu de l'espace mémoire et de la vitesse de traitement

Si vous effectuez des calculs lourds, utilisez des types primitifs. Sinon, si vous vous intéressez davantage au design, les pièces de compteur d'objets seront très utiles.

2 Puisque vous n'utilisez aucun framework si j'observe correctement, je vous suggère de créer une interface commeValidated avec une méthodebool validate () . Et à chaque fois que vous essayez de mettre une entrée dans l'appel de base de données validate à l'avance.

 2
Author: TwilightSun, 2014-01-10 02:22:12

1) Utilisez Long si vous devez traiter la valeur comme un objet. Utilisez longtemps sinon; c'est plus efficace.

2) Appel au jugement, vraiment. En approfondissant cela signifie que vous allez vérifier même lorsque la valeur provient d'une source de confiance, mais cela peut détecter des erreurs dans un autre code. Le rapprocher de l'entrée utilisateur signifie que vous perdez cette vérification approfondie de la santé mentale (et que vous devrez peut-être vérifier à plus d'un endroit), mais évite de passer du temps à vérifier les choses que vous avez déjà vérifiées. Ce qui est le mieux dépend de comment vous prévoyez d'utiliser / améliorer ce code à l'avenir.

 0
Author: keshlam, 2014-01-10 02:15:39
  1. Comme Long est un type privimitive de classe wrapper long et Long est une classe, ce qui indique que son instance pourrait être nulle. De mon point de vue, utiliser la classe wrapper est meilleur que le type primitif car il pourrait y avoir un état null, ce qui pourrait nous dire plus d'informations.
    De plus, la classe wrapper sera automatiquement initialisée avec 0, c'est bon pour l'utilisation paresseuse.

  2. Pour la validation des données, je pense que vous feriez mieux de le faire dans controller plutôt que DAO, alors ayez un bon méthode pour gérer cela ou alerter l'utilisateur pour les modifier!

 0
Author: Rugal, 2014-01-10 02:17:33

L'avantage de la Longue classe est que la valeur peut être nulle. Dans votre cas, si aucun IDENTIFIANT long n'est fourni, si vous détectez rapidement cela avec quelque chose comme..

public ClientInput(Long userid, Long clientid, Map<String, String> parameterMap, Long timeout_ms, boolean debug) {
    if (userid == null) {
          throw new IllegalArgumentException("userid is null");
    }

À votre deuxième question, vous pouvez également placer votre validation d'ID dans le constructeur. Cela garantit que si l'ID est null ou invalide, un ClientInput ne peut jamais être créé. Mais il n'y a pas de" meilleure " réponse pour l'endroit où vous mettez cette validation, cela dépend de la structure du reste de votre code, mais idéalement vous voulez attrapez de telles choses le plus tôt possible.

public ClientInput(Long userid, Long clientid, Map<String, String> parameterMap, Long timeout_ms, boolean debug) {
    if (userid == null || userid < USER_ID_MIN || userid > USER_ID_MAX ) {
          throw new IllegalArgumentException("userid is invalid");
    }

Une autre option consiste à accepter le paramètre userid en tant que Long, en le testant pour null, mais ensuite à le stocker en tant que long privé et primitif, une fois que vous savez qu'il est valide.

 0
Author: slipperyseal, 2014-01-10 02:19:51

J'essaie de garder les objets Bean aussi simples que possible, ce qui signifierait gérer la validation ailleurs - soit dans une classe de validateur distincte, soit dans une méthode validate (). L'algorithme général est le même:

  • validateInputParametres()
  • readDb ()

Je ferais quelque chose comme:

final ClientInput input = new ClientInput(109739281L, 20L, paramMap, 1000L, true);
validate(input); // throw/handle exceptions here

final Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("attribute", "segmentation");

final IDBClient client = DatabaseClientFactory.getInstance();
client.read(input);
 0
Author: as21, 2014-01-10 02:42:06