Strona główna > Java > Nie tak już rozwlekła java

Nie tak już rozwlekła java

Jest to kontynuacja tematu który rozpocząłem w poprzednim wpisie. Na końcu doszedłem do wniosku, że przydałaby mi się pewna własność języka. No i proszę długo nie musiałem czekać i już jest (właściwie była tylko ja ją teraz znalazłem). Chodzi o Lombok, może nie daj zbyt wiele, ale to co oferuje zmusza do przemyślenia sposobu jak można programować w javie🙂. Oprócz strony projektu świetnym wprowadzeniem jest ta prezentacja, którą prowadzą sami twórcy i może jeszcze ten wpis.
Mam wiele pomysłów jakie to może mieć zastosowanie, jednak aby nie rozwlekać pokaże jak można przy pomocy tego rozwiązać problem z poprzedniego wpisu.

Jakie to daje korzyści
Problem dotyczył duplikacji kodu (zaznaczone linie):

    public List getExpenses(long userId, Date start_date, Date end_date) {
        AuditLogger.logLookup(userId, AuditCode.GET_EXPENSES);
        ExpensesConnection connection = new ExpensesConnection(userId);
        List expenses = connection.findAllBetween(start_date, end_date);
        connection.close();
        return expenses;
    }

    public void addExpense(long userId, Date date, BigDecimal amount) {
        AuditLogger.logLookup(userId, AuditCode.ADD_EXPENSES);
        ExpensesConnection connection = new ExpensesConnection(userId);
        connection.saveNewExpense(date, amount);
        connection.flush();
        connection.close();
    }

Rozwiązaniem które można tu użyć to wzorzec szablonu, poprzez użycie klasy anonimowej. Jednak usunięcie duplikacji jest kosztem czytelności.
Dlatego też wprowadziłem byt, który jak się okazało nie rozwiązał tego problemu ze względu na techniczne ograniczenia języka. Teraz dzięki Lombok można to zrobić, kod wygląda tak:

	public List getExpenses(long userId, Date start_date, Date end_date) {
		@Cleanup ConnectionHelper helper = new ConnectionHelper(userId, AuditCode.GET_EXPENSES);
	    return helper.connection.findAllBetween(start_date, end_date);
	}

	public void addExpense(long userId, Date date, BigDecimal amount) {
		@Cleanup ConnectionHelper helper = new ConnectionHelper(userId, AuditCode.ADD_EXPENSES);
	    helper.connection.saveNewExpense(date, amount);
	    helper.connection.flush();
	}
	
	private ExpensesConnection doBefore(long userId, String logId) {
	    AuditLogger.logLookup(userId, logId);
	    ExpensesConnection connection = new ExpensesConnection(userId);
	    return connection;
	}

	private void doAfter(ExpensesConnection connection) {
	    connection.clone();
	}

	class ConnectionHelper {
		ExpensesConnection connection;
	    public ConnectionHelper(long userId, String logId) {
	        connection = doBefore(userId, logId);
	    }
	    public void close(){
	    	doAfter(connection);
	    }
	}

Użyłem tu @Cleanup trochę nie w tym celu do którego został zaprojektowany. Jednak otrzymałem konstrukcje gwarantującą mi że kod techniczny wykona się przed i po kodzie biznesowym (niezależnie co tam się stanie). I jest to czytelne, obie części kodu są odseparowane od siebie, po prostu piękne😉.

Wnioski
Integracja Lombok w projekty javowe jest dobrze zrobiona (na początku był wspierany tylko eclips, ale teraz i reszta IDE też to podobno trawi), użyłem tego w przykładowym projekcie pod mavenem i też śmiga. Znalezione zastrzeżenia: to że narzędzia do analizy jakości kodu mogą tu zgłaszać błędy bo nie widzą kodu.
To w jaki sposób Lombok rozwiązuję problemy rozwlekłości w javie pokazuje zupełnie nową drogę do obchodzenia braków języka. Teraz nie trzeba prosić zarządców javy o dodanie nowego słówka kluczowego, tylko przy pomocy adnotacji zrobić sobie samemu takie coś (twórcy zapewniają że można pisać własne rozszerzenia, a oto dowód).

Kategorie:Java Tags: ,
  1. Brak komentarzy.
  1. No trackbacks yet.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: