2012-05-19 2 views
0

Я начинающий программист, и это мой первый вопрос на этом форуме.Java-Как вызвать класс со строкой?

Я пишу простую текстовую приключенческую игру с использованием BlueJ в качестве компилятора, и я нахожусь на Mac. Проблема, с которой я столкнулся, заключается в том, что я хотел бы сделать мой код более автоматизированным, но я не могу назвать класс со строкой. Причина, по которой я хочу вызвать класс, и не иметь его в функции if, чтобы я мог использовать больше методов.

Вот как это будет работать в данный момент:

public class textadventure { 
public method(String room){ 
if(room==street){street.enterRoom();} 
} 
} 
public class street{ 
public enterRoom(){ 
//do stuff and call other methods 
} 
} 

если заявление тестов для каждого класса/номер я создаю. То, что я хотел бы сделать код, - это автоматически сделать строку с номером класса, которое можно вызвать. Так он может действовать следующим образом:

Public method(string room){ 
Class Room = room; 
Room.enterRoom(); 
} 

Я уже посмотрел в использовании Class.forName, но все примеры были слишком общими для меня, чтобы понять, как использовать эту функцию. Любая помощь будет принята с благодарностью, и если есть какая-либо другая необходимая информация (например, более примерный код), я рад предоставить ее.

-Sebastien

Вот полный код:

import java.awt.*; 
import javax.swing.*; 

public class Player extends JApplet{ 
public String textOnScreen; 

public void start(){ 
room("street1"); 
} 

public void room(String room){ 
    if(room=="street1"){ 
    textOnScreen=street1.enterRoom(); 
    repaint(); 
    } 
    if(room=="street2"){ 
    textOnScreen=street2.enterRoom(); 
    repaint(); 
    } 
} 
public void paint(Graphics g){ 
    g.drawString(textOnScreen,5,15); 
} 
} 

public abstract class street1 
{ 
private static String textToScreen; 
public static String enterRoom(){ 
    textToScreen = "You are on a street running from North to South."; 
    return textToScreen; 
} 
} 

public abstract class street2 
{ 
private static String textToScreen; 
public static String enterRoom(){ 
    textToScreen = "You are on another street."; 
    return textToScreen; 
} 
} 
+0

У вас есть маленькая вещь, свисающая под вами ... –

+0

Есть намного лучшие способы сделать это. Этот подход, который вы описываете, представляет собой огромный запах кода. (Egads, «stringly typed» code.) –

+0

Если Java, 'Public' должен быть строчным, строка' string' должна быть в виде строки. 'textadventure' должен, по соглашению, если не грамматикой, также быть титульным. – Amadan

ответ

0
String className=getClassName();//Get class name from user here 
String fnName=getMethodName();//Get function name from user here 

Class params[] = {}; 
Object paramsObj[] = {}; 

Class thisClass = Class.forName(className);// get the Class 

Object inst = thisClass.newInstance();// get an instance 
// get the method 
Method fn = thisClass.getDeclaredMethod(fnName, params); 
// call the method 
fn.invoke(inst, paramsObj); 
+0

Позвольте мне просто опубликовать именно то, что у меня есть, которое уже работает. – Sebastien

0

Комментарии ниже Ваш вопрос истинны - ваш код очень грубо.

Во всяком случае, если у вас есть метод, как

public void doSomething(String str) { 
    if (str.equals("whatever")) { 
    // do something 
    } 
} 

Затем вызовите его, как

doSomething("whatever"); 
+0

Будет ли это более полезно? – Sebastien

+0

Я не понимаю вашего комментария. Будет ли мой ответ более полезным? Я бы ожидал, что это будет по крайней мере немного полезно ... – Steve

+0

Извините, что спросила, будет ли более полная публикация полного кода. – Sebastien

3

Видя, как вы довольно новыми для программирования, я бы рекомендовал начать с некоторыми программами, которые проще полноценная приключенческая игра. Вы все еще не полностью поняли некоторые основы синтаксиса Java. Возьмем, к примеру, программу HelloWorld:

public class HelloWorld { 
    public static void main(String[] args) { 
    String output = "Hello World!" 
    System.out.println(output); 
    } 
} 

Обратите внимание, что public является строчными. Public с капиталом P - это не то же самое, что и public.

заметить также, что String класс имеет капитал S. * Опять же, вопросы капитализации, так string не то же самое, как String.

Кроме того, обратите внимание, что мне не нужно было использовать String string = new String("string"). Вы можете использовать String string = "string". Этот синтаксис работает быстрее и легче читать.

При тестировании равенства строк вам необходимо использовать String.equals вместо ==. Это связано с тем, что a == b проверяет равенство объекта (т. Е. a и b занимают одно и то же место в памяти), а stringOne.equals(stringTwo) проверяет, имеет ли stringOne те же символы в том же порядке, что и stringTwo, независимо от того, где они находятся в памяти.

Теперь, что касается вашего вопроса, я бы рекомендовал использовать либо Enum, либо Map, чтобы отслеживать, какой объект использовать.

Например:

public class Tester { 

    public enum Location { 

    ROOM_A("Room A", "You are going into Room A"), 
    ROOM_B("Room B", "You are going into Room B"), 
    OUTSIDE("Outside", "You are going outside"); 
    private final String name; 
    private final String actionText; 

    private Location(String name, String actionText) { 
     this.name = name; 
     this.actionText = actionText; 
    } 

    public String getActionText() { 
     return this.actionText; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public static Location findByName(String name) { 
     name = name.toUpperCase().replaceAll("\\s+", "_"); 
     try { 
     return Enum.valueOf(Location.class, name); 
     } catch (IllegalArgumentException e) { 
     return null; 
     } 
    } 
    } 


    private Location currentLocation; 

    public void changeLocation(String locationName) { 
    Location location = Location.findByName(locationName); 
    if (location == null) { 
     System.out.println("Unknown room: " + locationName); 
    } else if (currentLocation != null && currentLocation.equals(location)) { 
     System.out.println("Already in room " + location.getName()); 
    } else { 
     System.out.println(location.getActionText()); 
     currentLocation = location; 
    } 
    } 

    public static void main(String[] args) { 
    Tester tester = new Tester(); 
    tester.changeLocation("room a"); 
    tester.changeLocation("room b"); 
    tester.changeLocation("room c"); 
    tester.changeLocation("room b"); 
    tester.changeLocation("outside"); 
    } 
} 

* Это стандартный способ форматирования кода Java. Имена классов: PascalCased, а имена переменных - camelCased.

+0

Я понял: я исправлю свои «грамматические» ошибки. Я был на ipad, когда впервые разместил это, поэтому так получилось. В противном случае спасибо за совет по новому методу String(). Я не был уверен в этом, и поскольку код работал, я не хотел ничего менять. – Sebastien

+0

@Sebastien См. Мои правки для примера того, как использовать 'Enum' для решения вашей проблемы. –

0

В Java многие классы имеют атрибуты, и вы можете и часто будете иметь несколько экземпляров из одного класса.

Как бы вы определили, что именно по названию?

Например

class Room { 
    List<Monster> monsters = new ArrayList <Monster>(); 
    public Room (int monstercount) { 
     for (int i = 0; i < monstercount; ++i) 
      monsters.add (new Monster()); 
    } 
    // ... 
} 

Монстры могут иметь атрибуты, и если один из них мертв, вы можете определить его более легко, если вы не обрабатывать все в строках.

Смежные вопросы