Widziałem obiekty utworzone w kodzie Java bez przechowywania odniesienia do obiektu. Na przykład we wtyczce Eclipse widziałem powłokę SWT utworzoną w następujący sposób:
new Shell();
Ten nowy obiekt Shell nie jest przechowywany w zmiennej, ale pozostanie przywoływany, dopóki okno nie zostanie usunięte, co [Wierzę?] Dzieje się domyślnie, gdy okno jest zamknięte.
Czy tworzenie takich obiektów bez przechowywania odniesienia do nich jest złą praktyką? A może biblioteka była źle zaprojektowana? Co jeśli nie potrzebuję referencji, a chcę tylko „efektów ubocznych” obiektu? Czy mimo to powinienem przechowywać referencje?
AKTUALIZACJA:
Wprawdzie mój powyższy przykład jest słaby. Chociaż widziałem elementy interfejsu użytkownika utworzone w ten sposób, tworzenie powłoki SWT prawdopodobnie byłoby bezcelowe, ponieważ musisz wywołać metodę otwartą w instancji powłoki. Istnieją lepsze przykłady podane przez aix, takie jak poniższe z samouczka Java o współbieżności :
(new HelloThread()).start();
Ta praktyka jest postrzegana w wielu kontekstach, więc pytania pozostają. Czy to dobra praktyka?
Shell.createTopLevelShell()
lub cokolwiek innego, niż użycie konstruktora w tym przypadku. Ale funkcjonalnie nie ma różnicy.)dispose()
d: Reguła 1: Jeśli go utworzyłeś, pozbędziesz się go. eclipse.org/articles/swt-design-2/swt-design-2.htmlOdpowiedzi:
Jest w tym element osobistej preferencji, ale myślę, że nieprzechowywanie referencji niekoniecznie jest złą praktyką.
Rozważ następujący hipotetyczny przykład:
Jeśli dla każdego pliku należy utworzyć nowy obiekt procesora i nie jest on potrzebny po
process()
wywołaniu, nie ma sensu przechowywanie odwołania do niego.Oto kolejny przykład zaczerpnięty z samouczka dotyczącego współbieżności Java :
Widziałem wiele innych przykładów, gdy odwołanie nie jest przechowywane, i które czytają mi doskonale, takie jak:
(The
StringBuilder
Obiekt nie jest przechowywany.)Istnieją podobne wzorce dotyczące common.lang's
HashCodeBuilder
i in.źródło
getInstance()
jest fabryką, a nie singletonem).process
.Jeśli nie potrzebujesz odwołania do utworzonego obiektu, nie trzymaj się tego odniesienia. To takie proste.
źródło
Zasadniczo dobrą praktyką jest publikowanie referencji tak szybko, jak można je racjonalnie opublikować. Nie widzę różnicy między:
i
Jeśli chodzi o kod, po prostu unikasz używania nazwy zmiennej, co może być pozytywne. Kompilator JIT jest na ogół wystarczająco inteligentny, aby rozpoznać, że może odrzucić wątek po ostatnim użyciu, więc prawdopodobnie nie ma różnicy z punktu widzenia wydajności.
Jedynym prawdziwym problemem, którego należy unikać, jest kod w konstruktorze , ale nie brzmi to tak, jakbyś o to pytał.
źródło
Może to być złe, jeśli używasz SWT, ponieważ musisz po sobie posprzątać (wywołując metodę dispose ()). Ale w przypadku innych klas (nie SWT) jest w porządku.
Oto artykuł o zarządzaniu zasobami systemu operacyjnego
źródło
Przede wszystkim zirytujesz ludzi, którzy nauczyli się C lub C ++ przed Javą. Zostawię to jako ćwiczenie dla czytelnika, aby zdecydować, czy jest to zawodowiec, czy oszust.
Chociaż z pewnością istnieją sytuacje, w których obiekty są zaprojektowane tak, aby były krótkotrwałe, większość z nich czasu, jeśli coś jest wystarczająco złożone, aby stworzyć obiekt, jest wystarczająco złożone, aby mieć dobre powody, aby zachować odniesienie, więc nie należy go utrzymywać przynajmniej ostrzeżenie, aby dwukrotnie sprawdzić, czy coś przeoczyłeś.
Na przykład w samouczku nikt nie dba o zachowanie odniesienia do wątku, ale w prawdziwym życiu, jeśli coś trwa wystarczająco długo, abyś mógł założyć wątek, zwykle trwa to wystarczająco długo, aby móc anulować wątek. Lub jeśli żyją krócej, zwykle spawnujesz wiązkę wątków, którą będziesz chciał
join
przed kontynuowaniem. Lub chcesz się upewnić, że tworzenie wątków rzeczywiście się powiodło. Lub chcesz upewnić się, że nić kończy się czysto przed wyjściem. Dostajesz obraz.źródło