2013-03-16 13 views
6

Chcę mieć metodę, która utworzy obiekt klasy i automatycznie nazwie go "b1" dla pierwszego obiektu, "b2" na drugi, i tak dalej. Czy mogę użyć nazwy String jako nazwy nowego obiektu? Jeśli to możliwe, jak to zrobić?Nazywanie nowego obiektu po ciągu?

class being { 
    static int count = 0; 
    String name; 

    void createbeing(){ 
     name = "b" + Integer.toString(count); 
     being name = new being(); //Here I want to insert the String name as the name of the object 
     count++; 
    } 

} 
+10

Powinieneś wyjaśnić, * dlaczego * chcesz to zrobić, ponieważ jest mało prawdopodobne, że naprawdę musisz to zrobić. – assylias

+3

Gdybym miał jedną czwartą za każdym razem, o co go proszono, ... Proszę zrozumieć, że 1) nazwa zmiennej nie == nazwa obiektu, a w rzeczywistości obiekt nie ma nazw, a obiekty mogą być przypisane do więcej niż jedna zmienna. 2) nazwa zmiennej naprawdę nie jest ważna dla uruchomionego programu, ale najważniejsze jest napisanie czytelnego dla człowieka kodu, który jest łatwy do debugowania. 3) nazwa zmiennej dla wszystkich intencji i celów nawet nie istnieje w uruchomionym kodzie.4) Co ** jest ** ważne to * referencje * obiektu. –

Odpowiedz

9

Nie, to nie jest możliwe w Javie; nie można tworzyć zmiennych w czasie wykonywania. Można jednak zachować numer Map, który odwzorowuje identyfikatory String na odpowiadające im numery . tj

Map<String, Being> map = new HashMap<String, Being>(); 
... 
name = "b" + Integer.toString(count); 
map.put(name, new Being()); 
count++; 

pamiętać, że nabrały bardziej konwencjonalny nazwie: Being w przeciwieństwie do being.

+1

Ok wydaje mi się, że muszę nauczyć się czegoś nowego :) Dzięki! – Syntic

2

mogę użyć ciągu jako nazwa obiektu?

nr Zwykłym sposobem, aby to zrobić byłoby użyć jednego z implementacjami List i dodać obiekty do niej, na przykład:

class being{ 
    static List<being> beings = new LinkedList<being>(); 

    void createbeing(){ 
     beings.add(new being()); 
    } 
} 

(jestem nie opowiada za pomocą statycznego Jest prawie na pewno lepsze podejście do większego problemu, który próbujesz rozwiązać, ale był to minimalny modyfikator kodu, który przedstawiłeś.)

Alternatywnie, możesz użyć Map i faktycznie uzyskać he nazwy chciałeś ("b1" i tak dalej):

class being{ 
    static int count = 0; 
    static Map<String,being> beings = new HashMap<String,being>(); 

    void createbeing(){ 
     count++; 
     beings.add("b" + count, new being()); 
    } 
} 

(samo zastrzegające jak powyżej).

1

Nie można tego osiągnąć w ten sposób. Jeśli nazwa zmiennej jest ważne dla ciebie, sklep jak klucze Map<String,being>

Map<String,being> map = new HashMap<String,being>(); 
map.put("b1", new being()); 
2

Dodaj atrybut nazwisko do swojej klasie (który powinien być nazwany Being, BTW, a nie being), a do jego konstruktora :

public class Being 
    private String name; 

    public Being(String name) { 
     this.name = name; 
    } 
} 

Wtedy tworzyć obiekty:

void createBeing(){ 
    name = "b" + Integer.toString(count); 
    Being being = new Being(name); 
    // TODO: do something with the Being object 
    count++; 
} 

ten sposób obiekt może mieć nazwę. Nie mylić obiektów i zmiennych.

+0

Jak dotąd jest to najlepszy sposób ... na odpowiedź na to pytanie – Pragnani

3

W twoim kodzie właśnie tworzysz lokalne odwołanie do obiektu klasy w funkcji "createbeing()", a wyżej zadeklarowany ciąg "name" jest ukryty w zakresie funkcji "createbeing()" przez odniesienie " imię ", które deklarujesz jako odniesienie do przedmiotu, który jest klasą.

Powiązane problemy