Java: Klasa Statyczna?

Mam klasę pełną funkcji użytkowych. Tworzenie instancji instancji nie ma sensu semantycznego, ale nadal chcę nazywać jej metody. Jak najlepiej sobie z tym poradzić? Zajęcia statyczne? Abstrakcja?

Author: Nick Heiner, 2009-12-04

7 answers

Prywatny konstruktor i statyczne metody na klasie oznaczonej jako final.

 157
Author: David Robles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-09 23:44:48

Według wielkiej księgi "skuteczna Java":

Item 4: wymuszanie niestanowienia za pomocą prywatnego konstruktora

- próba wyegzekwowania niestanowienia przez abstrakcję klasy nie działa.

- konstruktor domyślny jest generowany tylko wtedy, gdy klasa nie zawiera jawnych konstruktorów, więc klasa może być niestanowiąca przez włączenie prywatnego konstruktora:

// Noninstantiable utility class
public class UtilityClass
{
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

Ponieważ konstruktor jawny jest szeregowy, jest niedostępny poza klasą. AssertionError nie jest ściśle wymagane, ale zapewnia ubezpieczenie w przypadku przypadkowego wywołania konstruktora z klasy. Gwarantuje to, że Klasa nigdy nie zostanie utworzona w żadnych okolicznościach. Ten idiom jest łagodnie sprzeczny z intuicją, ponieważ konstruktor jest wyraźnie podany, aby nie mógł być wywołany. Dlatego mądrze jest dołączyć komentarz, jak pokazano powyżej.

Jako efekt uboczny, ten idiom zapobiega również klasa z podklasą. Wszystkie konstruktory muszą wywoływać konstruktor klasy nadrzędnej, jawnie lub niejawnie, a podklasa nie miałaby dostępnego konstruktora klasy nadrzędnej do wywołania.

 91
Author: David Robles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 01:53:19

Wygląda na to, że masz klasę narzędzi podobną do java.lang.Matematyka .
Podejście tam jest klasą końcową z prywatnym konstruktorem i metodami statycznymi.

Ale uważaj, co to robi dla testowalności, polecam przeczytanie tego artykułu
metody statyczne to śmierć Testowalności

 20
Author: crowne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 06:50:50

Aby płynąć pod prąd, statyczni członkowie i klasy nie uczestniczą w OO i dlatego są źli. Nie, Nie złe, ale poważnie, polecam regularne zajęcia z pojedynczym wzorem dostępu. W ten sposób, jeśli musisz nadpisać zachowanie w dowolnym przypadku na drodze, nie jest to poważne przeformułowanie. OO jest twoim przyjacielem: -)

Mój $.02

 6
Author: Bennett Dill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 02:55:20

Skomentuj argumenty "prywatnego konstruktora" : daj spokój, deweloperzy nie są aż tak głupi, ale są leniwi. tworzenie obiektu a następnie wywoływanie metod statycznych? nie ma mowy.

Nie spędzaj zbyt wiele czasu, aby upewnić się, że twoja klasa nie może być nadużywana. miej trochę wiary w swoich kolegów. i zawsze jest sposób na nadużycie swojej klasy, bez względu na to, jak ją chronisz. jedyną rzeczą, której nie można nadużywać, jest rzecz, która jest całkowicie bezużyteczna.

 2
Author: irreputable,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 02:42:12
  • końcowa klasa i prywatny konstruktor (dobry, ale nie niezbędny)
  • Publiczne metody statyczne
 2
Author: fastcodejava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 03:16:18

Nie ma sensu deklarować klasy jako static. Po prostu zadeklaruj jej metody static i wywołaj je z nazwy klasy jako normalne, jak Klasa Java Math .

Również, nawet jeśli nie jest konieczne, aby konstruktor był prywatny, jest to dobry pomysł, aby to zrobić. Zaznaczenie konstruktora private uniemożliwia innym tworzenie instancji twojej klasy, a następnie wywoływanie statycznych metod z tych instancji. (Te wywołania działają dokładnie tak samo w Javie, są po prostu mylące i zaszkodzić czytelności Twojego kodu.)

 1
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-04 02:04:13