Kod uruchomić, aby zmienne statyczne

głosy
-1

Że mam klasę takiego:

public class FileMethods {

private static final Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

public static void doSomething(){
}

}

Jak zainicjować doc prawidłowo? To obecnie generuje błąd kompilacji (nieprzechwycony wyjątku), więc jest to możliwe, aby zainicjować doc bez wyraźnego wywołania metody?

Utwórz 26/08/2013 o 01:57
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
7

Lepiej zainicjować doc w statycznej metody inicjatora. Zaletą stosowania metody jest to, że można owinąć inicjalizacji w try/catchbloku.

Odpowiedział 26/08/2013 o 01:58
źródło użytkownik

głosy
1

--- Zmieniano bo długa odpowiedź nie może zmieścić się w komentarzu ---

Mam zamiar zacytować wzór c2.com i forach dyskusyjnych anty-wzór, gdzie można zanurzyć się w zawiłości obiektowego myślenia i obmyślać mocne i słabe strony różnych podejść.

Jest to fundamentalne naruszenie hermetyzacji dać więcej funkcji dostępu do stanu prywatnego, niż potrzebują. Metody użytkowych, które są pozostawione jako członków klasy są często przyznawane lepszy dostęp niż oni wymagać, utrudniając identyfikację i wymusić niezmienniki projektowe. Jeśli funkcjonalność metoda może być wyrażony publicznego interfejsu klasy, a następnie pisanie go jako funkcję trzeciego zwiększa ogólną enkapsulacji.

Klasa ze wszystkich metod statycznych ostatecznie musi niepokoić się ze wszystkimi danymi i pozycji w klasach przekazywanych do niego. Powoduje to szereg problemów.

  1. To odwraca hermetyzacji, jak zachowanie staje się trwale na zewnątrz klasy. Na przykład, „doSomething” w przykładzie poniżej nie należy do żadnej instancji klasy. Odwrócony hermetyzacji == klas, które działają bardziej jak kodowanym, brakuje krytycznego zachowania wymaganej do rozwiązania problemu.
  2. To komplikuje testów jednostkowych. Mogłem próbować wzbudzać razem szybkie przykład, ale to obejmuje to znacznie lepiej niż byłbym w stanie zrobić tak szybko .
  3. To sprawia, że ​​Twój kod trudne do utrzymania w sposób, który jest łatwy do przewidzenia będzie potrzebował konserwacji. Kiedykolwiek pod uwagę, że być może trzeba drugi dokument? Baw wyciętych i wklejania (technika wtrysku bug) lub konwersji swoje rzeczy do instancji (zabawa polowanie za pomocą kodu), dzięki czemu można mieć klasę bazową i podklasy dla różnic. Począwszy od przypadkach będzie trzeba tylko zaznaczyć instancji klasy abstrakcyjne, utworzyć dwa pliki podklasy i przenieść jedną metodę do „default” było podklasy, pisząc metodę drugiej podklasy. Nie polowanie przez kodzie == wygrać.
  4. Wszystkie klasy statyczne są bardzo trudne do rozładunku. Nie redukcja pamięci jest możliwe, gdy nie je za pomocą, bez jakiegoś bardzo egzotycznego klasy załadunku.
  5. Wszystkie klasy statyczne są bardzo trudne do wydajnych. Brak umiejętności utworzyć klasę na wątek lub klasę za zadanie równoległego. Ma gwarancji, że metoda między rozmowami, które można zapobiec inne tematy z wywołaniem metod. Z przypadkach można tworzyć instancje wątku-prywatnego.

Lista jest długa, ale jeśli czujesz, że sytuacja zasługuje na szczególną uwagę, a następnie użyć metody statyczne.

--- Original post następująco ---

Klasa, która zawiera wszystkie elementy statyczne i metod jest bardzo problematyczne. Dlaczego nie utworzyć wystąpienie, tak jak

public class FileMethods {
   private final Document doc;

   public FileMethods() {
      doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
   }

   public void doSomething() {
      doc.checkSomething();
      doc.doSomething();
      doc.doSomethingElse();
   }
}

a tam jest. będziesz mieć możliwość pracy na dwóch dokumentów jednocześnie. Możesz również uzyskać możliwość ewentualnie sprawdzić swoją klasę FileMethods w ramach testów jednostkowych (bez jakiegoś naprawdę wstecznej kodu).

Miarę wyjątku.

 try {
    doc = ...;
 } catch (SomeCompilerException e) {
   e.printStackTrace();
 }

Jest to dobry początek. Jeszcze lepiej, jeśli nie może obsłużyć wyjątek w tym bloku kodu ...

 public FileMethods() throws SomeCompilerException {
    doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
 }

i obsługiwać go w bloku kodu, gdzie ma to sens.

 try {
    FileMethods methods = new FileMethods();
    methods.doSomething();
 } catch (SomeCompilerException e) {
    System.out.println("Not possible to make a document right now due to " + e);
 }
Odpowiedział 26/08/2013 o 02:06
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more