2013-03-11 9 views
13

przykładem Kod:W jaki sposób dowiedzieć się o łączeniu wyników statycznych ciągów w Intellij Idea bez uruchamiania kodu?

public class StringHolder{ 
    public static final String ONE = "ONE"; 
    public static final String TWO = "TWO"; 
    public static final String THREE = "THREE"; 

    public static void main (String[] args){ 
     String someVariable = ONE + TWO + THREE; 
    } 
} 

Jak mogę ocenić wartość String od stałych statycznych ?. Na przykład, przy pomocy Intellij Idea mogę uruchomić program w debugowaniu, umieścić break point, naciśnij "ctrl + alt + f8" na wyrażenie i zobacz wartość wyrażenia. Czy można to ocenić za pomocą analizatora statycznego bez kodu kompilacji i uruchomić program? Kluczowym punktem jest wartość obliczona z stałych statycznych nie z parametru funkcji, więc analizator po prostu "przechodzi" do stałej wartości, łączy je i pokazuje wartość w wyskakującym okienku.

Inna sytuacja kiedy mam blok i "tylko" zainicjowane zmienne:

{ 
    final String a = "a"; 
    final String b = "b" 
    final String c = "c" 
    String result = a+b+c; 
} 

PS: Zrozumiałeś mnie? :)

+0

Zobacz gdzie? Twoje pytanie jest niepełne. – Perception

+0

Edytowałem pytanie. – Cherry

Odpowiedz

21

Łatwo z IntelliJ IDEA 14:

  1. prostu umieścić kursor na konkatenacji ciąg
  2. Prasa alt + wprowadzić
  3. wybierz "Kopiuj String konkatenacji tekst do schowka"
  4. Wklej wynik gdzieś.
+0

dziękuję, pamiętaj, że możesz używać tylko końcowych zmiennych i literałów. W przeciwnym razie dostaniesz? jako wartość –

+0

Dzięki. Przydatny skrót. Należy zauważyć, że w bardzo rzadkich przypadkach konkatenacja nie jest prawdą. Na przykład 'String text = 'A' + 1 +" ";' ten skrót skopiuje do schowka "A1" zamiast rzeczywistej wartości 'text' (66). Wersja IntelliJ 2016.3 – KernelMode

3

Użytkownik będzie mógł zobaczyć w czasie kompilacji łączone ciąg "ONETWOTHREE" przez dekompilacji kodu bajtowego:

javap -c StringHolder 

i patrząc na pierwsze zadanie.

Konkatenacja dla first + second + third nadal będą wykonywane w czasie wykonywania, a nie w czasie kompilacji, więc będę oczekiwać, aby zobaczyć kod za pomocą StringBuilder lub StringBuffer, i nie będzie żadnego „Wynik” tego połączonego łańcucha znaków bez uruchamiania kod.

0
public static final String ONE = "ONE"; 
public static final String TWO = "TWO"; 
public static final String THREE = "THREE"; 

czas kompilacji stałych i będą wstawiane podczas kompilacji.

Możesz zobaczyć wynik w pliku .class wygenerowany przez dekompilację. Drugi result nie będzie widoczny do czasu wykonania.

Dla someVariable zobaczysz coś takiego jak someVariable = "ONETWOTHREE"; w dekompilowanym kodzie. Kompilator robi to dla optymalizacji, więc jest widoczny.

Powiązane problemy