String czy StringBuilder

0

Cześć, prosze o potwierdzenie, że w tym przypdaku jest lepiej używać StringBuildera niż Stringów?

StringBuilder:

protected void polishFinalTextBuilder(){
		StringBuilder polishBuild = new StringBuilder();
		
		polishBuild.append("\n+++Naprawy niezbedne: \n")
		.append(PagesControl.taNecessary.getText())
		.append("\n\n+++Naprawy zalecane: \n")
		.append(PagesControl.taRecommended.getText())
		.append("\n\n+++Akcesoria: \n")
		.append(PagesControl.taAccessories.getText())
		.append("\n\n+++Uwagi: \nGwarancja tylko na wymienione części! \n")
		.append(PagesControl.cautions.getText())
		.append("\n\n"+ getBatteryIsSelected())
		.append("\n" + getStylusIsSelected())
		.append("\n" + getSealOkIsSelected())
		.append("\n" + getSealNotIsSelected())
		.append("\nSystem operacyjny: ")
		.append(PagesControl.cbDeviceSystem.getText())
		.append("\nModel lasera: ")
		.append(PagesControl.cbLaserModel.getText())
		.append("\nTechnik: ")
		.append(PagesControl.cbEngineer.getText());
		
		PagesControl.taAllDescription.append(polishBuild.toString());
	}

String:

protected String getFinalText() {
		if (isPolish())
			
return ("\n"+ "+++Naprawy niezbedne:"+"\n"+ PagesControl.taNecessary.getText()+"\n"+"\n"
+ "+++Naprawy zalecane:"+"\n"
+PagesControl.taRecommended.getText()+"\n"+"\n" 
+ "+++Akcesoria:"+"\n"
+ PagesControl.taAccessories.getText()+"\n"+ "\n"
+ "+++Uwagi:"+"\n"+"Gwarancja tylko na wymienione części!"+"\n"
+ PagesControl.cautions.getText()+"\n"+"\n"
+ getBatteryIsSelected()+"\n"
+ getStylusIsSelected()+"\n"
+ getSealOkIsSelected()+"\n"
+ getSealNotIsSelected()+"\n"
+ "System operacyjny: "
+ PagesControl.cbDeviceSystem.getText()+"\n"
+ "Model lasera: "
+ PagesControl.cbLaserModel.getText()+"\n"
+ "Technik: "+PagesControl.cbEngineer.getText());
		
		if (isEnglish())
return ("\n"+ "+++Necessary repairs:"+"\n"
+ PagesControl.taNecessary.getText()+"\n"+ "\n"
+ "+++Recommended repairs:"+"\n"
+ PagesControl.taRecommended.getText()+"\n"+ "\n"
+ "+++Accessories to buy:"+"\n"
+ PagesControl.taAccessories.getText()+"\n"+ "\n"
+ "+++Cautions:"+"\n"+"Warranty only for exchanged spare parts!"+"\n"
+ PagesControl.cautions.getText()+"\n"+"\n"
+ getBatteryIsSelected()+"\n"
+ getStylusIsSelected()+"\n"
+ getSealOkIsSelected()+"\n"
+ getSealNotIsSelected()+"\n"
+ "Device System: "
+ PagesControl.cbDeviceSystem.getText()+"\n"
+ "Scan engine model: "
+ PagesControl.cbLaserModel.getText()+"\n"
+ "Technican: "
+PagesControl.cbEngineer.getText());
		
		return "";
		
	}

Ogólnie, poczytałem troche na ten temat i lepszym rozwiązaniem jest StringBuilder. Przeważnie należy go stosować, nie tworzy za każdym razem nowych Stringów, tylko operuje na jednym itp.
Wiem że pytanie, banalne, ale chciałbym żebyscie mi to potwierdzili i podpowiedzieli może czy coś jeszcze musiałbym tu poprawić? Dzięki

0

Dla prostych Stringów używałbym zwykłej konkatenacji. Po kompilacji w bytecodzie i tak zrobi się z tego StringBuilder.
Przeczytaj sobie te Twoje przykłady jeszcze raz i zastanów się, na które byś wolał natrafić w projekcie :)

No i te rozpoczęcie nowej linii dałbym na koniec, bo za dużo sie trzeba przez nie przekopać, żeby dojść do faktycznej treści

0
baant napisał(a):

Dla prostych Stringów używałbym zwykłej konkatenacji. Po kompilacji w bytecodzie i tak zrobi się z tego StringBuilder.
Przeczytaj sobie te Twoje przykłady jeszcze raz i zastanów się, na które byś wolał natrafić w projekcie :)

No i te rozpoczęcie nowej linii dałbym na koniec, bo za dużo sie trzeba przez nie przekopać, żeby dojść do faktycznej treści

Zakładanie, że kompilator coś zrobi może doprowadzić do ciekawych bugów w przyszłości.

0

Ale ja nic nie zakładam. To jest fakt

0

Nie mówię, że nie jest ;) Z tym, że Ty wiesz o tym, że proste konkatenacje kompilator zamieni na StringBuilder'a. Ktoś inny stwierdzi, że równie prosta konkatenacja w pętli też będzie zamieniona na StringBuildera i tak dalej i tak dalej

2

Wkurza jak ktoś komplikuje kod, po to żeby oszczędzić 3 cykle w funkcji wykonywanej 2 razy na dzień.

3
  1. Generalnie zarówno łączenie Stringów wprost jak i używanie StringBuilder.append są relatywnie wolne, dlatego JVMka ma wbudowanego "sprytnego regexa", który wykrywa takie partie kodu i zastępuje dużo wydajniejszym wygenerowanym na gorąco kodem maszynowym. Skuteczność tej zamiany zależy od tego czy ten "regexp" wykryje klejenie stringów poprawnie. Klejenie stringów w dziwny sposób (np "mega zoptymalizowany") prawdopodobnie sprawi, że JVMka nie rozpozna typowego schematu klejenia stringów i nie podmieni go na wyżyłowany maszynowy kod.

  2. Kompilator Javy 9 (chodzi tu o javac) zamienia klejenie stringów w kodzie Javowym na wywołanie instrukcji invokedynamic w bajtkodzie: http://openjdk.java.net/jeps/280 Instrukcji invokedynamic nawet nie ma jak wywołać z poziomu kodu Javowego (no chyba, że jakąś refleksją czy inną magią, ale i tak tego nikt nie robi), więc by polegać na tej nowej metodzie optymalizacji trzeba po prostu kleić stringi klasycznym sposobem, tak by kompilator rozpoznał ten sposób.

Cała magia jest opisana pod linkiem z punktu drugiego, ale podam go jeszcze raz dla widoczności: http://openjdk.java.net/jeps/280
Polecam lekturę :]
PS: "indify" w tytule oznacza użycie instrukcji INvokeDYnamic

0

Dzieki za odpowiedzi.
@jarekr000000 czy mógłbyś wyjaśnić co Cię wkurzyło w tym kodzie? To że zamiast łaczenia Stringów, chce zrobić to StringBuilderem? Czy o coś innego chodzi?

0

Po sformatowaniu kodu pod Eclipse oba fragmenty kodu wyglądają jednakowo brzydko ( ). Punkt dla Inteli j.

1 użytkowników online, w tym zalogowanych: 0, gości: 1