Programacion en java

Iniciado por Shakos, 2 Abril 2011, 16:18 PM

0 Miembros y 1 Visitante están viendo este tema.

Shakos

Hola buenas tengo un problema con la programacion en java, me dan una clase ya hecha la cual me retorna un dato de lo leido en una linea en forma de String hasta aqui ningun problema , el principal problema viene cuando no puedo hacer un switch.
Mi solucion ha sido poner un conjuto de if ..else etc etc pero se me plantea otro problema cuando intento guardar algo lo que sea , dentro de un atributo , es decir , this.loquesea = ...., me sale con que no puedo hacer eso porque el atributo no es de tipo static y yo no puedo ponerlo de esa forma. Para que lo entiendan este es un poco el codigo de ejemplo:

boolean ejecutar = true; //
   
      while(ejecutar){
          System.out.println("Comando:");
          String opcion = ClaseAuxiliar.leerLinea();// opcion cumple la funcion de leer linea.
          String publicacion = ClaseAuxiliar.leerLinea();// cumple la funcion de leer

          Publicacion publ;
          //CONDICIONES DEL MENÚ
          //PUBLICACIÓN
          if("publicar".equalsIgnoreCase(opcion)){

              long fecha = ClaseAuxiliar.getFechaActual();
              String fechanum = ClaseAuxiliar.fechaNumericaString(fecha);

              Publicacion nueva = new Publicacion(fecha,fechanum,publicacion);
              publ = nueva;
              publ.publicaciones(publ);
              publ.imprimirPubl();
         
// Mi problema esta en llevar ( publ) hasta el siguiente if el de ( "escrito" )dado que no puedo guardarlo en ningun atributo y si lo guardo en un atributo static solo puede tomar un valor

          }
          if("escrito".equalsIgnoreCase(opcion)){
     
               

          }

Si saben alguna manera de guardar la informacion sin tener que poner un atributo de tipo static se lo agradeceria

.PD perdon por la tosca explicacion pero no se muy bien como expresarlo

Isótopo

Creo que debes de crear el objeto publ fuera del while, para no machacarlo en cada bucle. Si no también lo que puedes hacer es, en vez de igualarlo a nueva, hacer un clone si lo has implementado:

Publicacion publ = nueva.clone();

No entiendo cuando dices lo de llevártelo al siguiente if. Si creas ese objeto en la misma clase, tiene que ser visible, digo yo.

-Asus Crosshair IV Formula            
-AMD Phenom II X6 1090T 3.94Ghz @1.38V
-Corsair H70
-Sapphire Radeon HD 6970 2GB Dual-Fan
-G.Skill PIS PC3-17066 4GB 1900MHz 7-9-7-20 @1.65V
-WD Caviar Black 500GB
-Seagate Barracuda Green 2TB x2
-Antec TruePower New 750W Modular
-Cooler Master Dominator CM-690

Shakos

#2
Basicamente a lo que yo me referia a esto : fijate en la parte que pone//  publ.imprimirPubl();
bueno eso no tendria que estar hay , me explico , deberia estar en el otro if el de "escrito", el problema es que publ no guarda el valor entre if's es decir cuando lo pongo en el otro if el netbeans me dice que publ no esta inicializado cuando yo se que si lo esta pero arriba, eso pense que se solucionaria guardando su valor en un atributo pero me pedia que fuera de tipo static cosa que no puede ser porque en otra parte del codigo hay un arraylist por lo tanto si el atributo es estatico lo que me hace es simplemente replicarme el mismo publ tantas veces como yo se lo haya puesto en vez de poner distintos publ como a mi me gustaria

Isótopo

Tu sabes que está inicializado, pero realmente no tiene por qué estarlo. Me explico, tu lo inicializas si la condicion del primer if es verdadera. Como son dos if aparte puede darse el caso de que el primero (donde se inicializa publ) sea falso y el segundo (donde quieres trabajar con publ) sea verdadero. En ese caso, no podrías trabajar con publ porque no esta inicializado. Si previamente (antes de los bloques if) lo inicializas, no debes de tener problemas. Puedes usar el constructor por defecto si no quieres darle valores a los atributos:

Publicacion publ = new Publicacion();

Creo que así no debes de tener problemas, si es que es ese tu problema xD

-Asus Crosshair IV Formula            
-AMD Phenom II X6 1090T 3.94Ghz @1.38V
-Corsair H70
-Sapphire Radeon HD 6970 2GB Dual-Fan
-G.Skill PIS PC3-17066 4GB 1900MHz 7-9-7-20 @1.65V
-WD Caviar Black 500GB
-Seagate Barracuda Green 2TB x2
-Antec TruePower New 750W Modular
-Cooler Master Dominator CM-690

Shakos

Muchas gracias  ;-) si ese era el problema , la verdad suponia que era una tonteria, no me habia dado ni cuenta.

Shakos

#5
Hola tengo otra pregunta , esta vez me gustaria saber como puedo discriminar un elemento de un String, es decir yo quiero que cuando el usuario escriba "por ejemplo" abrir: haga una accion y que cuando escriba abrir + una cosa que determine el usuario pase otra cosa, se que existe la opcion split pero no sale bien , pongo la parte del codigo para que se entienda mejor.

if("publicaciones".equalsIgnoreCase(opcion)){
              periodico.pagina();
          }
el caso es que el usuario tanto puede escribir , publicaciones como publicaciones + un nombre que el determine y que luego el programa buscara en un arraylist si es que se encuentra el problema es que claro no puedo , partir de forma efectiva el string o no se como hacerlo

Isótopo

Podrías intentarlo con split. El usuario que escriba "abrir+otra_opcion". Con el split separas la cadena por su signo "+". Ahora te creas un método estático, en otra clase aparte, que se encargue de llamar a un método o hacer una acción dependiendo de la cadena "otra_opcion". Puedes poner un switch para las distintas acciones que preveas y ya solo tendrías que llamar a ese método estático para resolver eso.

Quizás no sea necesario crearte otra clase y métodos estáticos, pero de esa forma te queda todo mucho más encapsulado y a la hora de corregir problemas o implementar nuevas soluciones es todo mucho más fácil.

-Asus Crosshair IV Formula            
-AMD Phenom II X6 1090T 3.94Ghz @1.38V
-Corsair H70
-Sapphire Radeon HD 6970 2GB Dual-Fan
-G.Skill PIS PC3-17066 4GB 1900MHz 7-9-7-20 @1.65V
-WD Caviar Black 500GB
-Seagate Barracuda Green 2TB x2
-Antec TruePower New 750W Modular
-Cooler Master Dominator CM-690