[JAVA] utilisé une variable pour cast
-
Effectivement, c’est possible que le default ne soit disponible qu’avec java 1.8. Mais vu que tu utilises des classes dont tu hérites tes items et blocks, pourquoi tu ne mets pas ce code dans ces classes ?
-
Mes classes dite primitives sont des extensions de classe Vanilla (héritage donc) qui ne me servent qu’a ajouter des fonctionnalité basique pour créer des block/item basique, et commune (enregistrement de l’objet, de la texture, du nom, de l’OreDictionnary…) ainsi que certaine fonctionnalité (par exemple, pour créer un outils, il suffit de donner un item (le lingot), et le reste est automatique. Ça évite de faire un héritage par élément pour avoir au final les même fonction, à la condition prêt (en l’occurance, l’objet pour réparer, crafter).
Si j’ai besoin de rajouter des fonctionnalité, j’ai plus qu’a créer une extension de cette dite classe propre a mon objet.
C’est même pas du modding au final, juste de la POO tous ce qu’il y a de plus basique.
Mais si vraiment sa te chagrine, je t’invite a regarder les sources sur le lien GitHub (post d’avant) et de me proposé des améliorations

SCAREX :
C’est ce que je fais actuellement. Le problème c’est que j’en suis a 5 classe (outils) + 3 classe (item, block, blockfallable) et 1 classe (base de mes armes) donc au total 9. 9 fois la même portion de code a item/block pres… Du coup, comme je dois modifier une partie (pour ajouter la gestion des texture minecraft que j’avais zapper), je dois modifier le code, puis le copier coller a 9 endroit…
-
Relis ce que j’ai mis, j’ai pas dis que c’était stupide, c’est même une bonne idée. La question c’est pourquoi tu mets ta fonction générique dans ces classes “primitives” ?
-
Bien a l’heure actuel les fonctions sont situé dans chacune des classe, car elle devais être appeler a la création, et faisais référence a des fonctions interne. Ça me semblais être l’endroit le plus logique, jusqu’à ce que je me rende compte que je dupliquais mon code a chaque fois ^^’
Du coup, j’ai décidé de le déplacer ailleurs. J’aurai alors pus copier coller le code 1 fois par classe minecraft (Block et Item à l’heure actuel) mais je me retrouvais a dupliquer le code.
Certe, pour un mod ça aurai suffit, mais je cherche toujours a apprendre des choses de plus en plus compliqué, du coup j’ai cherché à faire une fonction générique qui fonctionne avec tous (adaptant juste la le type de l’objet, et une le nom d’une des fonctions.Quand a ce que tu a dis, je ne pense pas que tu sois stupide au point de faire référence à modifier les classes Vanilla, du coup j’ai crue comprendre que tu me disais de mètre mes fonctions dans mes classe “primitive”, ce qui est actuellement le cas, et reste un comportement qui me déplaît (à cause de la duplication du code)
-
Essaye avec çà:
public static void register<t>(T obj, String name,String oreDicName){ if (obj instanceof JBlock) { JBlock jb = (JBlock)obj; jb.setBlockName(JFunction.convertNameToUnLocalizedName(name)); GameRegistry.registerBlock(jb, name); if (!("".equals(jb.oreDictionnaryName))) { // Si le nom est vide ou la variable est null, retourne false (çà évite les NPE) jb.oreDictionnaryName = JFunction.convertNameToOreDictionaryName(name); } OreDictionnary.registerOre(oreDicName, jb); } else if (obj instanceof JItem) { JItem ji = (JItem) obj; ji.setUnlocalizedName(JFunction.convertNameToUnLocalizedName(name)); GameRegistry.registerItem(ji, name); if (!("".equals(ji.oreDictionnaryName))) { // Si le nom est vide ou la variable est null, retourne false (çà évite les NPE) ji.oreDictionnaryName = JFunction.convertNameToOreDictionaryName(name); } OreDictionnary.registerItem(oreDicName, ji); } else { return; // WUT ?! } }PS : le code est tapé à la main donc il risque d’y avoir quelques erreurs.</t>
-
public static void register<t>(T obj, String name,String oreDicName)
Je dois avoué que je n’ai aucune idée de comment cela fonctionne, et qu’évidemment, c’est la partie qui ne fonctionne pas ^^’
<t>correspond a quoi ? une sort de classe objet temporaire ?EDIT :
public static void commonInit(String name, String modid, JCommonCreate obj, String modidTexture, String textureName, String oreDictionnaryName) { String m = convertNameToUnLocalizedName(name); if(name.equalsIgnoreCase(textureName)) { textureName = m; } if (oreDictionnaryName.isEmpty()) { oreDictionnaryName = convertNameToOreDictionaryName(name); } obj.setOreDictionnaryName(oreDictionnaryName); if(obj instanceof Block) { GameRegistry.registerBlock((Block) obj, m); Main.proxy.registerBlockTexture((Block) obj, textureName, modidTexture); OreDictionary.registerOre(oreDictionnaryName, (Block) obj); ((Block) obj).setUnlocalizedName(m); } else if(obj instanceof Item) { GameRegistry.registerItem((Item) obj, m); Main.proxy.registerItemTexture((Item) obj, textureName, modidTexture); OreDictionary.registerOre(oreDictionnaryName, (Item) obj); ((Item) obj).setUnlocalizedName(m); } else { JLog.write("[WARNING] The object name : " + name + " Isn't instance of autorized class."); } }(j’ai un problème avec les espaces avec le copier/coller…)
Grâce à l’interface j’ai pus simplifier certaine partie. Je dois (malheureusement) toujours définir les 2 fonctions dans ma classe.
En contrepartie, je peu directement faire appelle au classe de Minecraft pour instanceof, ce qui me réduit le nombre de condition de 8 a 2. C’est pas si mal, bien qu’il reste 3 fonctions qui sont strictement similaire au cast prés ^^" (4 si l’on considère que je peu ajuster le registerTexture avec une condition)</t></t> -
le <t>veut dire que la méthode est générique donc que tu peux lui fournir en paramètre n’importe quelle objet. Vu que ici tu veux pouvoir utiliser cette méthode pour les items ET les blocs, je ne peux pas préciser de super classe car tes blocs et items n’ont pas les mêmes parents.
Donc ici tu appelleras register<tonitem>(tonInstanceDItem, name, oreDicName);
Regarde comment sont faites les listes : tu peux faire une liste de n’importe quel type références (tout ce qui n’est pas primitif).</tonitem></t>
-
Donc si j’ai bien compris, ça permet d’utilisé l’annotation entre <> plutôt que la classe Object ?
-
Y’a pas d’histoire d’annotations, c’est une méthode générique. Ce que tu précises entre ces chevrons sera le type utilisé dans la méthode (quoique, je crois que tu n’es même pas obligé de le préciser).
Donc si le type est extend JItem, il sera considéré comme un Item.
Regarde des tutos sur les méthodes et classes génériques en java (çà existe dans beaucoup de langages).
-
Mouai, j’ai regardé deux trois tuto, et j’ai compris le gros du principe, mais le but m’échappe un peu, j’ai l’impression que ça permet de supplanté la classe object au final ^^’
enfin bon… Ce n’étais que pour optimisé encore plus, le résultat a l’heure actuel fonctionne suffisamment.
Je ne veux pas non plus perdre trop de temps sur l’optimisation alors que le code n’es pas encore finis, et que j’ai encore bon nombre de problème à la con ^^'… Du coup je passe le sujet en Résolu, et je m’y re pencherai plus tard dans l’année quand le mode sera suffisamment avancé^^Merci pour votre aide, et … A toute a l’heure pour un nouveau problème X)
-
Si tu veux vraiment optimiser le code, supprime toute ta librairie : Y’a pleins de choses qui mangent les performances pour rien comme la fonction qui convertit des noms en noms non-localisés. Moi dans mes mods j’utilise un seul nom pour le nom enregistré dans le GameRegistry et unlocalizedName, même si la convention est pas bonne.
-
bha en théorie, les fonctions dans Jfunction ne sont censé être utilise qu’une fois lors de la création du l’objet, donc outre la place en mémoire, les fonctions ne sont pas si gourmande qui ca en processeur (hors c’est souvent cette partie qui pêches)
Après je cherche pas a optimisé le code dans le sens fonctionnement, mais dans le sens codage : plus c’est automatisé, mieux c’est
(je cherche avant tous à prendre de l’avance sur le programme de DUT de l’année prochaine X) )