Esiste un modo per l'oggetto 1 di richiamare l'enumerazione dell'oggetto 2 in una chiamata di funzione?

1

Ad esempio, se ho due classi "Director" e "Follower". Voglio che il regista dica al follower dove andare (es: follower1.go(direction.LEFT) ), e voglio che il regista sappia quali direzioni può dire al follower di andare quando codifica in un IDE che fornisce suggerimenti di completamento.

So che posso già fare:

public void go(String direction);

o

public void goLeft();
public void goRight();
public void goUp();
public void goDown();

Ma il primo non mi darà opzioni in un IDE (o almeno, non so come mostrare le opzioni), e il secondo potrebbe essere difficile da mantenere per una funzione meno banale. Idealmente, mi piacerebbe qualcosa del tipo,

public enum Direction{LEFT, RIGHT, UP, DOWN};
public void go(Direction direction);

Ma ovviamente, questo non funziona (almeno in Java, e Direction fa parte della classe Follower). C'è un modo per utilizzare le enumerazioni (o qualsiasi altro modo) per ottenere qualcosa come il 3 ° effetto, dove posso sia limitare i parametri di una funzione, sia renderla facilmente visibile in un IDE che fornisce suggerimenti di completamento?

    
posta Travis 24.09.2014 - 19:29
fonte

2 risposte

2

I pensa se rimuovi public , funzionerà:

enum Direction{LEFT, RIGHT, UP, DOWN};

anche se credo che questo enum sarà accessibile solo ad altre classi che si trovano nello stesso pacchetto di Follower .

Perché Direction deve essere contenuto all'interno della classe Follower , quando anche il Director (che presumo sia una classe separata) dovrà usarlo? Se si desidera limitare l'ambito di questa enumerazione, è possibile dichiararla nello stesso pacchetto, ma in un file separato. In questo modo puoi cambiarlo con l'ambito public quando ne hai bisogno per accedervi altrove, e anche la sintassi per accedervi è più ordinata e pulita.

    
risposta data 24.09.2014 - 19:37
fonte
1

Ci sono due modi per farlo.

Come sottolineato da FrustratedWithFormDesigner, puoi rendere l'enum un'entità di primo livello.

L'altra opzione è lasciarla come membro interno di una delle tue classi. Per fare ciò, è possibile qualificare l'enumerazione con il nome della classe host:

go(Follower.Direction.LEFT);

Oppure puoi importare l'enum e usarlo come normalmente ti aspetti:

import somepackage.Follower.Direction
...
go(Direction.LEFT);

Ora, nel tuo caso, probabilmente suggerirei di andare con l'enum di primo livello, dato che Direction non mi colpisce immediatamente come "appartenente" a Follower o Director .

Per completezza, dovrei menzionare che c'è in realtà un terzo modo per accedere agli elementi enum: le importazioni statiche. Questo metodo dovrebbe essere usato con giudizio, se non del tutto, ma è qualcosa di cui essere a conoscenza.

import static somepackage.Direction.*;
....
go(LEFT);
    
risposta data 24.09.2014 - 20:36
fonte

Leggi altre domande sui tag