Hidden Features von Java

stimmen
295

Nach der Lektüre Hidden Features von C # Ich fragte mich, was sind einige der versteckten Features von Java?

Veröffentlicht am 19/08/2008 um 02:36
quelle vom benutzer
In anderen Sprachen...                            


100 antworten

stimmen
432

Doppel Brace Initialisierung hat mich überrascht vor ein paar Monaten , als ich es zum ersten Mal entdeckt, noch nie davon gehört.

ThreadLocals sind typischerweise nicht so verbreitet als an sich bekannter-Thread - Zustand zu speichern.

Seit JDK 1.5 Java sehr gut hatte darüber hinaus nur Schlösser implementiert und robuste Gleichzeitigkeit Tools, leben sie in java.util.concurrent und ein speziell interessantes Beispiel ist die java.util.concurrent.atomic subpackage , der Thread-sichere Primitiven enthält , die das Gerät vergleichen -and-Swap - Betrieb und kann auf tatsächliche nativen Hardware-unterstützten Versionen dieser Operationen bilden .

Beantwortet am 19/08/2008 um 21:09
quelle vom benutzer

stimmen
279

Gemeinsame Gewerkschaft in Typ-Parameter Varianz:

public class Baz<T extends Foo & Bar> {}

Zum Beispiel, wenn Sie wollen einen Parameter zu übernehmen, die sowohl Vergleichbare und eine Sammlung ist:

public static <A, B extends Collection<A> & Comparable<B>>
boolean foo(B b1, B b2, A a) {
   return (b1.compareTo(b2) == 0) || b1.contains(a) || b2.contains(a);
}

Diese erfundene Methode gibt true zurück, wenn die beiden gegebenen Sammlungen gleich sind oder wenn einer von ihnen enthält das gegebene Element, sonst false. Der Punkt zu bemerken ist, dass man Methoden sowohl Vergleichbare und Sammlung auf den Argumenten b1 und b2 aufrufe kann.

Beantwortet am 03/09/2008 um 22:51
quelle vom benutzer

stimmen
220

Ich war von Beispiel initializers neulich überrascht. Ich habe einige Codefalteten Methoden Löschen und beendet mehrere Instanz Initialisierungen Schaffung up:

public class App {
    public App(String name) { System.out.println(name + "'s constructor called"); }

    static { System.out.println("static initializer called"); }

    { System.out.println("instance initializer called"); }

    static { System.out.println("static initializer2 called"); }

    { System.out.println("instance initializer2 called"); }

    public static void main( String[] args ) {
        new App("one");
        new App("two");
  }
}

Die Ausführung der mainMethode wird angezeigt:

static initializer called
static initializer2 called
instance initializer called
instance initializer2 called
one's constructor called
instance initializer called
instance initializer2 called
two's constructor called

Ich denke, diese sinnvoll wäre, wenn Sie mehrere Konstrukteure haben und benötigt gemeinsamen Code

Sie bieten auch syntaktischen Zucker Ihre Klassen zur Initialisierung:

List<Integer> numbers = new ArrayList<Integer>(){{ add(1); add(2); }};

Map<String,String> codes = new HashMap<String,String>(){{ 
  put("1","one"); 
  put("2","two");
}};
Beantwortet am 06/09/2008 um 15:27
quelle vom benutzer

stimmen
201

JDK 1.6_07 + enthält eine App namens VisualVM (bin / jvisualvm.exe), die eine nette GUI oben auf viele der Werkzeuge ist. Es scheint, umfassender als JConsole.

Beantwortet am 11/09/2008 um 02:15
quelle vom benutzer

stimmen
173

ClassPath Wildcards seit Java 6.

java -classpath ./lib/* so.Main

Anstatt von

java -classpath ./lib/log4j.jar:./lib/commons-codec.jar:./lib/commons-httpclient.jar:./lib/commons-collections.jar:./lib/myApp.jar so.Main

siehe http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html

Beantwortet am 07/12/2009 um 12:59
quelle vom benutzer

stimmen
156

Für die meisten Leute, die ich Interview für Positionen Java Entwickler markierte Blöcke sind sehr überraschend. Hier ist ein Beispiel:

// code goes here

getmeout:{
    for (int i = 0; i < N; ++i) {
        for (int j = i; j < N; ++j) {
            for (int k = j; k < N; ++k) {
                //do something here
                break getmeout;
            }
        }
    }
}

Wer hat gesagt , gotoin Java ist nur ein Stichwort? :)

Beantwortet am 02/09/2008 um 13:57
quelle vom benutzer

stimmen
144

Wie wäre es kovarianten Rückgabetypen , die seit JDK 1.5 anstelle gewesen sein? Es ist ziemlich schlecht bekannt, da es eine unsexy hinaus, aber wie ich es verstehe, ist absolut notwendig für Generika zu arbeiten.

Im Wesentlichen kann der Compiler nun eine Unterklasse den Rückgabetyp einer überschriebenen Methode verengen eine Unterklasse der ursprünglichen Methode der Rückgabetyp zu sein. So ist dies erlaubt:

class Souper {
    Collection<String> values() {
        ...
    }
}

class ThreadSafeSortedSub extends Souper {
    @Override
    ConcurrentSkipListSet<String> values() {
        ...
    }
}

Sie können die die Unterklasse aufrufen valuesVerfahren und eine sortierte Thread - sicher erhalten Setvon Strings , ohne nach unten gegossen, die auf die ConcurrentSkipListSet.

Beantwortet am 29/08/2008 um 20:29
quelle vom benutzer

stimmen
142

Habe niemanden instanceof wird umgesetzt in einer solchen Art und Weise erwähnen gesehen, dass für null Überprüfung nicht erforderlich ist.

Anstatt von:

if( null != aObject && aObject instanceof String )
{
    ...
}

benutz einfach:

if( aObject instanceof String )
{
    ...
}
Beantwortet am 19/01/2009 um 16:01
quelle vom benutzer

stimmen
142

Übertragung der Kontrolle in einem finally-Block wirft jede Ausnahme entfernt. Der folgende Code nicht Runtime werfen - es verloren geht.

public static void doSomething() {
    try {
      //Normally you would have code that doesn't explicitly appear 
      //to throw exceptions so it would be harder to see the problem.
      throw new RuntimeException();
    } finally {
      return;
    }
  }

von http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html

Beantwortet am 15/09/2008 um 17:49
quelle vom benutzer

stimmen
134

Zulassen von Methoden und Konstrukteure in Aufzählungen mich überrascht. Beispielsweise:

enum Cats {
  FELIX(2), SHEEBA(3), RUFUS(7);

  private int mAge;
  Cats(int age) {
    mAge = age;
  }
  public int getAge() {
    return mAge;
   }
}

Sie können sogar einen „konstanten spezifische Klasse Körper“ haben, die ein bestimmte ENUM-Wert erlaubt Methoden außer Kraft zu setzen.

Weitere Dokumentation hier .

Beantwortet am 09/09/2008 um 22:10
quelle vom benutzer

stimmen
121

Die Art params für generische Methoden explizit wie so festgelegt werden:

Collections.<String,Integer>emptyMap()
Beantwortet am 11/09/2008 um 03:09
quelle vom benutzer

stimmen
112

Sie können Aufzählungen verwenden, um eine Schnittstelle zu implementieren.

public interface Room {
   public Room north();
   public Room south();
   public Room east();
   public Room west();
}

public enum Rooms implements Room {
   FIRST {
      public Room north() {
         return SECOND;
      }
   },
   SECOND {
      public Room south() {
         return FIRST;
      }
   }

   public Room north() { return null; }
   public Room south() { return null; }
   public Room east() { return null; }
   public Room west() { return null; }
}

EDIT: Einige Jahre später ....

Ich benutze diese Funktion hier

public enum AffinityStrategies implements AffinityStrategy {

https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/vanilla/java/affinity/AffinityStrategies.java

Durch die Verwendung einer Schnittstelle können Entwickler ihre eigenen Strategien definieren. Mit einem enumMittel Ich kann eine Sammlung definieren (von fünf) in diejenigen gebaut.

Beantwortet am 18/02/2009 um 22:10
quelle vom benutzer

stimmen
104

Ab Java 1.5, Java hat jetzt eine viel saubere Syntax für Funktionen der variablen arity zu schreiben. Also, statt nur ein Array vorbei, jetzt können Sie wie folgt vorgehen

public void foo(String... bars) {
   for (String bar: bars)
      System.out.println(bar);
}

Stäbe automatisch in Array des angegebenen Typs umgewandelt. Nicht ein großer Gewinn, aber ein Sieg dennoch.

Beantwortet am 03/11/2008 um 18:02
quelle vom benutzer

stimmen
93

Mein Favorit: dump all Thread Stack-Traces auf Standard aus.

Fenster: CTRL- Breakin Ihrem Java - cmd / Konsolenfenster

Unix: kill -3 PID

Beantwortet am 17/09/2008 um 14:23
quelle vom benutzer

stimmen
89

Ein paar Leute haben sich darüber Beispiel initializers geschrieben, hier ist eine gute Verwendung für sie:

Map map = new HashMap() {{
    put("a key", "a value");
    put("another key", "another value");
}};

Ist eine schnelle Möglichkeit, Karten zu initialisieren, wenn Sie nur etwas schnell und einfach zu tun.

Oder verwenden sie einen schnellen Schwenkrahmen Prototyp zu erstellen:

JFrame frame = new JFrame();

JPanel panel = new JPanel(); 

panel.add( new JLabel("Hey there"){{ 
    setBackground(Color.black);
    setForeground( Color.white);
}});

panel.add( new JButton("Ok"){{
    addActionListener( new ActionListener(){
        public void actionPerformed( ActionEvent ae ){
            System.out.println("Button pushed");
        }
     });
 }});


 frame.add( panel );

Natürlich kann es missbraucht werden:

    JFrame frame = new JFrame(){{
         add( new JPanel(){{
               add( new JLabel("Hey there"){{ 
                    setBackground(Color.black);
                    setForeground( Color.white);
                }});

                add( new JButton("Ok"){{
                    addActionListener( new ActionListener(){
                        public void actionPerformed( ActionEvent ae ){
                            System.out.println("Button pushed");
                        }
                     });
                 }});
        }});
    }};
Beantwortet am 27/10/2008 um 01:12
quelle vom benutzer

stimmen
88

Dynamische Proxies (hinzugefügt in 1.3) erlaubt es , eine neue Art zur Laufzeit zu definieren , die mit einer Schnittstelle übereinstimmt. Es ist praktisch , eine überraschend hohe Zahl von Zeiten kommen.

Beantwortet am 03/09/2008 um 02:29
quelle vom benutzer

stimmen
82

endgültige Initialisierung kann verschoben werden.

Es stellt sicher, dass auch bei einem komplexen Fluss der Logik Rückgabewerte werden immer gesetzt. Es ist zu einfach, einen Fall zu verpassen und null zurück durch Zufall. Es macht nicht null unmöglich zurückkehren, nur offensichtlich, dass es absichtlich ist:

public Object getElementAt(int index) {
    final Object element;
    if (index == 0) {
         element = "Result 1";
    } else if (index == 1) {
         element = "Result 2";
    } else {
         element = "Result 3";
    }
    return element;
}
Beantwortet am 03/10/2008 um 22:59
quelle vom benutzer

stimmen
62

Ich denke, eine andere „übersehen“ Feature von Java ist die JVM selbst. Es ist wahrscheinlich die beste VM zur Verfügung. Und es unterstützt viele interessante und nützliche Sprachen (Jython, JRuby, Scala, Groovy). All diese Sprachen können einfach und nahtlos zusammenarbeiten.

Wenn Sie eine neue Sprache entwickeln (wie in der scala-Fall) Sie haben sofort alle vorhandenen Bibliotheken zur Verfügung und Ihre Sprache ist daher „nützlich“ von Anfang an.

Alle diese Sprachen nutzen die HotSpot Optimierungen. Die VM ist sehr gut überwachen und debug.

Beantwortet am 19/08/2008 um 17:47
quelle vom benutzer

stimmen
58

Sie können eine anonyme Unterklasse definieren und rufen Sie direkt eine Methode auf sie, auch wenn es keine Schnittstellen implementiert.

new Object() {
  void foo(String s) {
    System.out.println(s);
  }
}.foo("Hello");
Beantwortet am 22/06/2009 um 02:17
quelle vom benutzer

stimmen
56

Die asList Verfahren java.util.Arraysermöglichen eine schöne Kombination von varargs, generischen Methoden und Autoboxing:

List<Integer> ints = Arrays.asList(1,2,3);
Beantwortet am 15/09/2008 um 16:55
quelle vom benutzer

stimmen
53

Unter Verwendung dieses Schlüsselwort für den Zugriff auf Felder / Methoden der Klasse von einer inneren Klasse enthält. Im unten, sondern erfundenen Beispiel wollen wir SortAscending Bereich der Container - Klasse von der anonymen inneren Klasse verwenden. Mit ContainerClass.this.sortAscending statt this.sortAscending funktioniert der Trick.

import java.util.Comparator;

public class ContainerClass {
boolean sortAscending;
public Comparator createComparator(final boolean sortAscending){
    Comparator comparator = new Comparator<Integer>() {

        public int compare(Integer o1, Integer o2) {
            if (sortAscending || ContainerClass.this.sortAscending) {
                return o1 - o2;
            } else {
                return o2 - o1;
            }
        }

    };
    return comparator;
}
}
Beantwortet am 19/09/2008 um 14:02
quelle vom benutzer

stimmen
52

Nicht wirklich eine Funktion, aber ein amüsanter Trick entdeckte ich vor kurzem in einigen Web-Seite:

class Example
{
  public static void main(String[] args)
  {
    System.out.println("Hello World!");
    http://Phi.Lho.free.fr

    System.exit(0);
  }
}

ein gültiges Java-Programm ist (obwohl es gibt eine Warnung aus). Wenn Sie nicht sehen, warum finden Sie Gregors Antwort! ;-) Naja, Syntax gibt hier auch einen Hinweis hervorheben!

Beantwortet am 17/09/2008 um 12:39
quelle vom benutzer

stimmen
46

Dies ist nicht gerade „hidden feature“ und nicht sehr nützlich, kann aber in manchen Fällen äußerst interessant sein:
Klasse sun.misc.Unsafe - ermöglicht es Ihnen , zu implementieren direkter Speicherverwaltung in Java (Sie sogar selbst-modifizierenden Java - Code schreiben können , mit dies , wenn Sie versuchen , eine Menge):

public class UnsafeUtil {

    public static Unsafe unsafe;
    private static long fieldOffset;
    private static UnsafeUtil instance = new UnsafeUtil();

    private Object obj;

    static {
        try {
            Field f = Unsafe.class.getDeclaredField("theUnsafe");
            f.setAccessible(true);

            unsafe = (Unsafe)f.get(null);
            fieldOffset = unsafe.objectFieldOffset(UnsafeUtil.class.getDeclaredField("obj"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    };
}
Beantwortet am 19/09/2008 um 14:35
quelle vom benutzer

stimmen
42

Wenn in Swing arbeiten mag ich die versteckte Ctrl- Shift- F1Funktion.

Es Dumps den Komponentenbaum des aktuellen Fensters.
(Angenommen , Sie nicht , dass der Tastendruck auf etwas anderes gebunden haben.)

Beantwortet am 02/12/2009 um 17:28
quelle vom benutzer

stimmen
40

Jede Klassendatei beginnt mit der Hex - Wert 0xCAFEBABE es als gültiges JVM - Bytecode zu identifizieren.

( Erklärung )

Beantwortet am 19/02/2010 um 06:29
quelle vom benutzer

stimmen
38

Meine Stimme geht an java.util.concurrent mit seinen gleichzeitigen Sammlungen und flexible Testamentsvollstrecker ermöglicht unter anderem Thread - Pools, geplante Aufgaben und koordinieren Aufgaben. Die DelayQueue ist mein persönlicher Favorit, wo Elemente nach einer bestimmten Verzögerung zur Verfügung gestellt werden.

java.util.Timer und Timertask sicher zur Ruhe setzen können.

Auch nicht gerade versteckt, aber in einem anderen Paket von den anderen Klassen im Zusammenhang mit Datum und Uhrzeit. java.util.concurrent.TimeUnit ist nützlich, wenn zwischen Nanosekunden, Mikrosekunden, Millisekunden, Sekunden umzuwandeln.

Er liest viel besser als die üblichen somevalue * 1000 oder somevalue / 1000.

Beantwortet am 04/12/2008 um 20:51
quelle vom benutzer

stimmen
37

Nicht wirklich Teil der Java-Sprache, aber der javap Disassembler, die mit Suns JDK kommt, ist nicht allgemein bekannt oder verwendet wird.

Beantwortet am 10/09/2008 um 18:20
quelle vom benutzer

stimmen
37

Sprachebene assert Stichwort.

Beantwortet am 19/08/2008 um 02:51
quelle vom benutzer

stimmen
36

Die Zugabe der für-jede Schleife in 1,5 konstruieren. I <3 it.

// For each Object, instantiated as foo, in myCollection
for(Object foo: myCollection) {
  System.out.println(foo.toString());
}

Und kann in verschachtelten Fällen verwendet werden:

for (Suit suit : suits)
  for (Rank rank : ranks)
    sortedDeck.add(new Card(suit, rank));

Das für-jedes Konstrukt ist auch anwendbar auf Anordnungen, in denen sie die Indexvariable versteckt statt dem Iterator. Die folgende Methode gibt die Summe der Werte in einem Array int:

// Returns the sum of the elements of a
int sum(int[] a) {
  int result = 0;
  for (int i : a)
    result += i;
  return result;
}

Link zur Sun-Dokumentation

Beantwortet am 16/09/2008 um 19:35
quelle vom benutzer

stimmen
34

i persönlich entdecken java.lang.Voidsehr spät - verbessert die Lesbarkeit des Codes in Verbindung mit Generika, zBCallable<Void>

Beantwortet am 17/02/2009 um 14:25
quelle vom benutzer

stimmen
30

Das vielleicht überraschendste versteckte Feature ist die sun.misc.Unsafe Klasse.

http://www.docjar.com/html/api/ClassLib/Common/sun/misc/Unsafe.java.html

Sie können;

  • Erstellen Sie ein Objekt ohne einen Konstruktor aufrufen.
  • Werfen Sie Ausnahme auch Exception ohne sich Gedanken über Klauseln über die Methoden wirft. (Es gibt auch andere Art und Weise das weiß ich zu tun)
  • Get / Set zufällig zugegriffen Felder in einem Objekt ohne Reflexion verwendet wird.
  • Zuweisen / Frei / Kopieren / einen Speicherblock, der die Größe (64-Bit) in der Größe lang sein kann.
  • Besorgen Sie sich die Lage der Felder in einem Objekt oder einer statischen Felder in einer Klasse.
  • unabhängig sperren und eine Objektsperre entriegeln. (Wie synchronisieren, ohne einen Block)
  • eine Klasse von Bytecodes vorgesehen definieren. Anstatt den Klassenlader zu bestimmen, was der Byte-Code sein sollte. (Sie können dies auch mit Reflexion tun)

BTW: falsche Verwendung dieser Klasse wird die JVM töten. Ich weiß nicht, welche JVMs diese Klasse so dass sie nicht tragbar unterstützen.

Beantwortet am 11/06/2009 um 21:10
quelle vom benutzer

stimmen
29

Hier ist meine Liste.

Mein Lieblings (und gruseligsten) versteckt ist, dass Sie überprüft Ausnahmen von Methoden werfen können, die erklärt werden, nichts zu werfen.

import java.rmi.RemoteException;

class Thrower {
    public static void spit(final Throwable exception) {
        class EvilThrower<T extends Throwable> {
            @SuppressWarnings("unchecked")
            private void sneakyThrow(Throwable exception) throws T {
                throw (T) exception;
            }
        }
        new EvilThrower<RuntimeException>().sneakyThrow(exception);
    }
}

public class ThrowerSample {
    public static void main( String[] args ) {
        Thrower.spit(new RemoteException("go unchecked!"));
    }
}

Auch können Sie wissen, wie Sie werfen ‚null‘ ...

public static void main(String[] args) {
     throw null;
}

Ratet mal, was diese druckt:

Long value = new Long(0);
System.out.println(value.equals(0));

Und erraten, was diese zurückgibt:

public int returnSomething() {
    try {
        throw new RuntimeException("foo!");
    } finally {
        return 0;
    }
}

die oben nicht gut Entwickler überraschen.


In Java können Sie ein Array in folgenden gültige Weise erklären:

String[] strings = new String[] { "foo", "bar" };
// the above is equivalent to the following:
String[] strings = { "foo", "bar" };

So folgende Java-Code ist perfekt gültig:

public class Foo {
    public void doSomething(String[] arg) {}

    public void example() {
        String[] strings = { "foo", "bar" };
        doSomething(strings);
    }
}

Gibt es einen triftigen Grund, warum stattdessen der folgende Code nicht gültig sein sollte?

public class Foo {

    public void doSomething(String[] arg) {}

    public void example() {
        doSomething({ "foo", "bar" });
    }
}

Ich denke, dass die obige Syntax ein gültiger Ersatz für die varargs in Java eingeführt gewesen wäre, 5. Und, noch im Einklang mit den zuvor erlaubt Array Erklärungen.

Beantwortet am 25/01/2010 um 10:45
quelle vom benutzer

stimmen
28

Shutdown Hooks. Dies ermöglicht einen Thread zu registrieren , die sofort erstellt werden, aber erst gestartet , wenn der JVM beendet! So ist es eine Art „globaler Jvm Finalizerthread“, und Sie können nützliche Dinge in diesem Thread machen (zum Beispiel des Herunterfahren Java Ressourcen wie ein eingebetteten hsqldb - Server). Dies funktioniert mit System.exit () oder mit STRG + C / kill -15 (aber nicht mit kill -9 auf Unix, natürlich).

Außerdem ist es ziemlich einfach einzurichten.

            Runtime.getRuntime().addShutdownHook(new Thread() {
                  public void run() {
                      endApp();
                  }
            });;
Beantwortet am 17/12/2009 um 00:47
quelle vom benutzer

stimmen
27

Der Wert von:

new URL("http://www.yahoo.com").equals(new URL("http://209.191.93.52"))

ist true.

(Von Java Puzzlers)

Beantwortet am 27/10/2008 um 01:03
quelle vom benutzer

stimmen
26

Wenn Sie eine Menge von JavaBean Entwicklung und die Arbeit mit Eigenschaftsänderung Unterstützung tun, wickeln Sie in der Regel ein Schreiben auf viel von Setter wie folgt aus :

public void setFoo(Foo aFoo){
  Foo old = this.foo;
  this.foo = aFoo;
  changeSupport.firePropertyChange("foo", old, aFoo);
}

Ich stolperte vor kurzem über einen Blog, der eine knappe Umsetzung dieser vorgeschlagen, die den Code viel leichter zu schreiben macht:

public void setFoo(Foo aFoo){
  changeSupport.firePropertyChange("foo", this.foo, this.foo = aFoo);
}

Es vereinfacht tatsächlich Dinge auf den Punkt, wo ich war in der Lage, die Setter-Vorlage in Eclipse so einzustellen, dass das Verfahren automatisch erstellt wird.

Beantwortet am 26/09/2008 um 04:30
quelle vom benutzer

stimmen
25

statische Importe zu „verbessern“, um die Sprache, so dass Sie schöne wörtliche Dinge in Art sichere Weise tun können:

List<String> ls = List("a", "b", "c");

(Kann auch mit Karten, Arrays, Sets tun).

http://gleichmann.wordpress.com/2008/01/13/building-your-own-literals-in-java-lists-and-arrays/

Wobei es weiter:

List<Map<String, String>> data = List(Map( o("name", "michael"), o("sex", "male")));
Beantwortet am 19/08/2008 um 03:06
quelle vom benutzer

stimmen
23

Nicht so versteckt, aber interessant.

Sie können ohne Hauptmethode ein „Hallo Welt“ (es wirft NoSuchMethodError dachte)

Ursprünglich von RusselW auf posted Strangest Sprache - Funktion

public class WithoutMain {
    static {
        System.out.println("Look ma, no main!!");
        System.exit(0);
    }
}

$ java WithoutMain
Look ma, no main!!
Beantwortet am 05/07/2010 um 19:22
quelle vom benutzer

stimmen
23

Java-Verarbeitung macht einen netten Trick auf Variablendefinition, wenn Sie keinen Standard initializer verwenden.

{
   int x;

   wenn (was auch immer)
      x = 1;

   if (x == 1)
      ...
}

Dadurch erhalten Sie einen Fehler bei der Kompilierung, dass Sie einen Weg haben, wobei X nicht richtig definiert. Das hat mich ein paar Mal geholfen, und ich habe auf die Prüfung Standardinitialisierung wie diese genommen:

int x = 0;
String s = null;

ein schlechtes Muster, da es blockiert diese hilfreich Kontrolle zu sein.

Das heißt, manchmal ist es schwer zu umgehen - ich habe zurück und bearbeiten in der = null gehen musste, wenn es Sinn als Standard gemacht, aber ich es nie mehr auf dem ersten Durchgang setzen in.

Beantwortet am 06/10/2008 um 19:14
quelle vom benutzer

stimmen
23

Als Vorspeise schätze ich die JConsole Überwachung wirklich Software in Java 6 hat es ein paar Probleme für mich schon gelöst und ich halte auf neue Anwendungen für sie zu finden.

Offenbar war der JConsole bereits in Java 5, aber ich denke, es jetzt verbessert und zumindest arbeitet wesentlich stabiler ab sofort.

JConsole in Java 5: JConsole in Java 5

JConsole in Java 6: JConsole in Java 6

Und während Sie gerade dabei sind, hat einen guten Blick auf den anderen Werkzeugen in der Serie: Java 6 Tools zur Fehlerbehebung

Beantwortet am 20/08/2008 um 12:30
quelle vom benutzer

stimmen
21

Das ist nicht wirklich ein verstecktes Feature, aber es gab mir eine große Überraschung, als ich das sah zusammengestellt fein:

public int aMethod(){
    http://www.google.com
    return 1;
}

der Grund , warum es kompiliert ist , dass die Linie http://www.google.com die „http:“ Teil vom Compiler als Label und der Rest der Zeile ist ein Kommentar behandelt wird.

Also, wenn Sie etwas bizzare Code (oder verschleierten Code) schreiben wollen, nur dort eine Menge von http-Adressen setzen. ;-)

Beantwortet am 28/06/2010 um 05:36
quelle vom benutzer

stimmen
20

Sie können eine Klasse in einer Methode deklarieren:

public Foo foo(String in) {
    class FooFormat extends Format {
        public Object parse(String s, ParsePosition pp) { // parse stuff }
    }
    return (Foo) new FooFormat().parse(in);

}
Beantwortet am 28/09/2008 um 16:45
quelle vom benutzer

stimmen
19

Es dauerte lange genug Unterstützung für diese Erweiterung,

System Tray

Beantwortet am 15/09/2008 um 16:50
quelle vom benutzer

stimmen
17

Selbstgebundene Generika:

class SelfBounded<T extends SelfBounded<T>> {
}

http://www.artima.com/weblogs/viewpost.jsp?thread=136394

Beantwortet am 10/09/2008 um 21:18
quelle vom benutzer

stimmen
17

Ich mag das neu geschrieben Threading-API von Java 1.6. Callables sind groß. Sie sind im Grunde Fäden mit einem Rückgabewert.

Beantwortet am 19/08/2008 um 03:03
quelle vom benutzer

stimmen
16

Ein Merkmal, mit dem Sie Splash-Screens für Ihre Java-Konsole basierter Anwendungen angezeigt werden können.

Verwenden Sie das Kommandozeilen - Tool javaoder javawmit der Option-splash

z.B:

java -splash:C:\myfolder\myimage.png -classpath myjarfile.jar com.my.package.MyClass

der Inhalt C:\myfolder\myimage.pngwird in der Mitte des Bildschirms angezeigt werden, wenn Sie die Klasse „com.my.package.MyClass“ execute

Beantwortet am 27/11/2009 um 09:39
quelle vom benutzer

stimmen
16

Oh, hätte ich fast vergessen dieses kleine Juwel. Versuchen Sie dies auf jedem laufenden Java-Prozess:

jmap -histo: Live-PID

Sie werden ein Histogramm der Live-Heap-Objekte in der gegebenen VM erhalten. Von unschätzbarem Wert als eine schnelle Möglichkeit, bestimmte Arten von Speicherlecks Figur. Eine andere Technik, die ich sie zu verhindern verwenden ist und größen begrenzt Subklassen aller Sammlungen Klassen verwenden zu erstellen. Dies bewirkt, dass schnelle Ausfälle in Out-of-Control-Sammlungen, die leicht zu identifizieren sind.

Beantwortet am 26/11/2009 um 20:03
quelle vom benutzer

stimmen
16

List.subList gibt einen Blick auf die ursprüngliche Liste

Ein dokumentierten aber wenig Merkmal von Listen bekannt. Auf diese Weise können Sie mit Teilen einer Liste mit Änderungen in der ursprünglichen Liste gespiegelt arbeiten.

Liste subList (int fromindex, int toIndex)

„Diese Methode eliminiert die Notwendigkeit für expliziten Bereich Operationen (von der Art, die für Arrays häufig vorhanden ist). Jede Operation, die eine Liste erwartet kann, indem man eine subList Ansicht anstelle einer ganzen Liste als Range-Betrieb verwendet wird. Zum Beispiel kann die folgenden Idiom entfernt eine Reihe von Elementen aus einer Liste:

       list.subList(from, to).clear();

Ähnliche Idiome können für indexOf und lastIndexOf konstruiert werden, und alle der Algorithmen in der Klasse Collections können auf eine subList angewandt werden.“

Beantwortet am 17/02/2009 um 14:22
quelle vom benutzer

stimmen
16

Ich mag den statischen Import von Methoden.

Zum Beispiel der folgenden util Klasse erstellen:

package package.name;

public class util {

     private static void doStuff1(){
        //the end
     }

     private static String doStuff2(){
        return "the end";
     }

}

verwenden Sie es dann wie folgt aus.

import static package.name.util.*;

public class main{

     public static void main(String[] args){
          doStuff1(); // wee no more typing util.doStuff1()
          System.out.print(doStuff2()); // or util.doStuff2()
     }

}

Statische Importe arbeitet mit jeder Klasse, auch Math ...

import static java.lang.Math.*;
import static java.lang.System.out;
public class HelloWorld {
    public static void main(String[] args) {
        out.println("Hello World!");
        out.println("Considering a circle with a diameter of 5 cm, it has:");
        out.println("A circumference of " + (PI * 5) + "cm");
        out.println("And an area of " + (PI * pow(5,2)) + "sq. cm");
    }
}
Beantwortet am 17/02/2009 um 13:56
quelle vom benutzer

stimmen
15

mit statischen Importen können Sie coole Sachen tun:

List<String> myList = list("foo", "bar");
Set<String> mySet = set("foo", "bar");
Map<String, String> myMap = map(v("foo", "2"), v("bar", "3"));
Beantwortet am 04/02/2009 um 18:19
quelle vom benutzer

stimmen
15

Javadoc - wenn sie richtig geschrieben (nicht immer der Fall mit einigen Entwicklern leider), es gibt Ihnen eine klare, schlüssige Beschreibung dessen, was Code tun soll, im Gegensatz zu dem, was es tatsächlich der Fall ist. Es kann dann in eine schöne Sammlung von HTML-Dokumentation gedreht werden. Wenn Sie die kontinuierliche Integration usw. verwenden kann, es regelmäßig generiert werden, so dass alle Entwickler können das neueste Updates sehen.

Beantwortet am 12/11/2008 um 17:59
quelle vom benutzer

stimmen
15

Nicht wirklich eine Funktion, aber es macht mich lachen , dass gotoein reserviertes Wort , das nichts tut , außer Aufforderung Javac Sie im Auge zu stoßen. Nur daran erinnern , dass Sie in OO-Land jetzt sind.

Beantwortet am 20/08/2008 um 11:07
quelle vom benutzer

stimmen
14

Sie können Methoden auf anonyme innere Klassen definieren und aufrufen.

Nun, sie sind nicht so versteckt, aber nur sehr wenige Menschen wissen, dass sie verwendet werden können, eine neue Methode in einer Klasse zu definieren, und rufen Sie es wie folgt aus:

(new Object() {
    public String someMethod(){ 
        return "some value";
    }
}).someMethod();

Wahrscheinlich ist nicht sehr verbreitet , weil es nicht sehr nützlich, können Sie entweder die Methode nennen es nur , wenn Sie definieren es (oder über Reflexion)

Beantwortet am 22/06/2010 um 00:04
quelle vom benutzer

stimmen
14

Das strictfp Schlüsselwort. (Ich habe es allerdings nie in einer realen Anwendung verwendet :)

Sie können die Klasse für primitive Typen erhalten, indem Sie die folgende Notation: int.class, float.class, etc. Sehr nützlich, wenn Reflexion zu tun.

Endgültige Arrays kann verwendet werden, um Werte von anonymen inneren Klassen „Rückkehr“ (Warnung, nutzlos Beispiel unten):

final boolean[] result = new boolean[1];
SwingUtilities.invokeAndWait(new Runnable() {
  public void run() { result[0] = true; }
});
Beantwortet am 01/01/2009 um 06:19
quelle vom benutzer

stimmen
13

Der C-Style printf () :)

System.out.printf("%d %f %.4f", 3,Math.E,Math.E);

Ausgang: 3 2.718282 2,7183

Binäre Suche (und es ist Rückgabewert)

int[] q = new int[] { 1,3,4,5};
int position = Arrays.binarySearch(q, 2);

Ähnlich wie C #, wenn ‚2‘ in der Anordnung nicht gefunden wird, gibt es einen negativen Wert, aber wenn Sie die 1-Komplement des zurückgegebenen Werts nehmen Sie tatsächlich die Position, wo ‚2‘ eingeführt werden kann.

In dem obigen Beispiel Position = -2, ~ Position = 1, die die Position ist, in 2 eingefügt werden soll ... es lässt Sie auch die „nächste“ Spiel im Array finden.

Ich denke es ist ziemlich raffinierte ... :)

Beantwortet am 30/06/2010 um 09:06
quelle vom benutzer

stimmen
13

Ich war mir bewusst , dass Java 6 Scripting - Unterstützung enthalten ist , aber ich habe gerade vor kurzem entdeckt jrunscript , die interpretieren und ausführen JavaScript (und man geht davon aus , andere Skriptsprachen wie Groovy) interaktiv, Art wie das Python - Shell oder irb in Ruby

Beantwortet am 03/09/2008 um 01:33
quelle vom benutzer

stimmen
12

Teil Funktion Teil stören: Java String-Handling zu machen ‚erscheinen‘ einen native Typ (Verwendung von Operatoren auf sie, +, + =)

zu schreiben in der Lage:

String s = "A";
s += " String"; // so s == "A String"

sehr bequem ist, aber es ist einfach syntaktischer Zucker für (dh wird kompiliert):

String s = new String("A");
s = new StringBuffer(s).append(" String").toString();

ergo ein Objektinstanziierung und 2 Aufrufe von Prozeduren für eine einfache Verkettung. Stellen Sie sich einen langen String in einer Schleife auf diese Weise Gebäude !? Und alle String Methoden deklariert synchronisiert. Zum Glück in (glaube ich) Java 5 eingeführt sie Stringbuilder, dem String ohne syncronization identisch ist.

Eine Schleife, wie zum Beispiel:

String s = "";
for (int i = 0 ; i < 1000 ; ++i)
  s += " " + i; // Really an Object instantiation & 3 method invocations!

kann (soll), wie im Code neu geschrieben werden:

StringBuilder buf = new StringBuilder(); // Empty buffer
for (int i = 0 ; i < 1000 ; ++i)
  buf.append(' ').append(i); // Cut out the object instantiation & reduce to 2 method invocations
String s = buf.toString();

und ungefähr 80 +% schneller als die ursprüngliche Schleife laufen! (Bis zu 180% bei einigen Benchmarks Ich habe laufen)

Beantwortet am 04/06/2009 um 10:06
quelle vom benutzer

stimmen
12

Ich weiß , das in Version hinzugefügt wurde 1,5 aber der neue Aufzählungstyp ist ein großartiges Feature. Nicht die alten „int enum Muster“ verwenden hat dazu beigetragen , stark ein Bündel von meinem Code. JLS 8.9 Schauen Sie sich für die süße Soße auf den Kartoffeln!

Beantwortet am 04/09/2008 um 16:55
quelle vom benutzer

stimmen
12

Es ist nicht gerade versteckt, aber Reflexion ist unglaublich nützlich und leistungsstark. Es ist toll, ein einfaches Class.forName ( „...“) zu verwenden. NewInstance (), wo der Klassentyp konfigurierbar ist. Es ist einfach, diese Art von Fabrik Umsetzung zu schreiben.

Beantwortet am 29/08/2008 um 20:17
quelle vom benutzer

stimmen
11

Ich habe gerade (wieder) gelernt heute, dass $ eine juristische Bezeichnung für ein Verfahren oder eine Variable in Java ist. In Kombination mit statischen Importen es für einig leicht lesbaren Code machen kann, je nach Ihrer Ansicht lesbar:

http://garbagecollected.org/2008/04/06/dollarmaps/

Beantwortet am 28/07/2009 um 04:21
quelle vom benutzer

stimmen
11

final zum Beispiel Variablen:

Wirklich nützlich für Multi-Threading-Code und es macht es viel einfacher, zu argumentieren, über die Instanz Zustand und Richtigkeit. Habe es nicht viel in der Industrie Kontext gesehen und oft nicht in Java-Klassen gedacht.


static {etwas;}:

Wird verwendet, um statische Member zu initialisieren (auch ziehe ich eine statische Methode, es zu tun (weil es einen Namen) hat. Nicht gedacht.

Beantwortet am 06/09/2008 um 10:07
quelle vom benutzer

stimmen
10

Verwenden Sie StringBuilderstatt , StringBufferwenn Sie brauchen nicht synchronisiert Management in enthalten StringBuilder. Es wird die Leistung der Anwendung erhöhen.

Verbesserungen für Java 7 wären noch besser, als versteckte Java-Funktionen:

  • Diamant - Syntax: Ein Link

Nicht jene unendlich <> Syntax bei Instanciation verwenden:

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

// Can now be replaced with this:

Map<String, List<String>> anagrams = new HashMap<>();
  • Strings in - Schalter: Ein Link

Verwenden Sie String in Schalter, anstelle der alten C int:

String s = "something";
switch(s) {
 case "quux":
    processQuux(s);
    // fall-through

  case "foo":
  case "bar":
    processFooOrBar(s);
    break;

  case "baz":
     processBaz(s);
    // fall-through

  default:
    processDefault(s);
    break;
}
  • Automatische Resource Management Link zu

Dieser alte Code:

static void copy(String src, String dest) throws IOException {
    InputStream in = new FileInputStream(src);
    try {
        OutputStream out = new FileOutputStream(dest);
        try {
            byte[] buf = new byte[8 * 1024];
            int n;
            while ((n = in.read(buf)) >= 0)
                out.write(buf, 0, n);
        } finally {
            out.close();
        }
    } finally {
        in.close();
    }
}

kann nun durch diesen viel einfachen Code ersetzt werden:

static void copy(String src, String dest) throws IOException {
    try (InputStream in = new FileInputStream(src);
            OutputStream out = new FileOutputStream(dest)) {
        byte[] buf = new byte[8192];
        int n;
        while ((n = in.read(buf)) >= 0)
            out.write(buf, 0, n);
    }
}
Beantwortet am 04/11/2009 um 16:00
quelle vom benutzer

stimmen
10

Eine Optimierung Trick, den Code leichter zu pflegen und weniger anfällig für einen gemeinsamen Zugriff Fehler macht.

public class Slow {
  /** Loop counter; initialized to 0. */
  private long i;

  public static void main( String args[] ) {
    Slow slow = new Slow();

    slow.run();
  }

  private void run() {
    while( i++ < 10000000000L )
      ;
  }
}

$ Time java Langsam
Echt 0m15.397s
$ time java Langsame
echte 0m20.012s
$ time java Verlangsamen
echte 0m18.645s

Durchschnitt: 18.018s

public class Fast {
  /** Loop counter; initialized to 0. */
  private long i;

  public static void main( String args[] ) {
    Fast fast = new Fast();

    fast.run();
  }

  private void run() {
    long i = getI();

    while( i++ < 10000000000L )
      ;

    setI( i );
  }

  private long setI( long i ) {
    this.i = i;
  }

  private long getI() {
    return this.i;
  }
}

$ Time java Schnelle
Echt 0m12.003s
$ time java Schnelle
Echt 0m9.840s
$ time java Schnelle
Echt 0m9.686s

Durchschnitt: 10.509s

Es erfordert mehr Bytecode einen Klasse-scope Variable als ein Verfahren-scope Variable zu verweisen. Die Zugabe von einem Methodenaufruf vor der kritischen Schleife fügt wenig Aufwand (und der Anruf kann trotzdem vom Compiler inline sein).

Ein weiterer Vorteil dieser Technik (immer mit Accessoren) ist , dass es einen potenziellen Fehler in der beseitigt langsame Klasse. Wenn ein zweiter Thread den Wert kontinuierlich zurückgesetzt war i auf 0 (durch den Aufruf slow.setI( 0 ), zum Beispiel), die langsame konnte Klasse nie seine Schleife beenden. Die Accessor aufrufen und eine lokale Variable eliminiert diese Möglichkeit.

Getestet J2SE 1.6.0_13 mit auf Linux 2.6.27-14.

Beantwortet am 22/06/2009 um 03:46
quelle vom benutzer

stimmen
10

„Const“ ist ein Schlüsselwort, aber man kann es nicht verwenden.

int const = 1;   // "not a statement"
const int i = 1; // "illegal start of expression"

Ich denke, der Compiler Schriftsteller dachte, es könnte in der Zukunft verwendet werden, und sie würden es besser halten vorbehalten.

Beantwortet am 16/09/2008 um 21:01
quelle vom benutzer

stimmen
9

Ich kann Scanner-Objekt hinzufügen. Es ist die beste für die Analyse.

String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();
Beantwortet am 09/06/2010 um 10:07
quelle vom benutzer

stimmen
9

Identifiers können Fremdsprache Zeichen wie Umlaute enthalten:

statt zu schreiben:

String title="";

könnte jemand schreiben:

String Überschrift="";
Beantwortet am 09/01/2010 um 21:04
quelle vom benutzer

stimmen
9

Etwas, das mich wirklich überrascht war der Brauch Serialisierungsmechanismus.

Während diese Methoden sind privat !! , Sie „sind auf mysteriöse Weise von der JVM während Objektserialisierung genannt“.

private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

So können Sie Ihre eigene benutzerdefinierte Serialisierung erstellen können, um es mehr „was auch immer“ (sicher, schnell, selten, leicht etc.)

Dies ist etwas, das wirklich sollte in Erwägung ziehen, wenn eine Menge an Informationen hat durchlaufen Knoten werden. Die Serialisierung Mechanismus kann verändert werden, um die Hälfte der Daten zu senden. Es gibt viele Male, wenn die Engpässe sind nicht in der Plattform, sondern in die Höhe dieser abgeschickt den Draht Trog, können Sie Tausende von DLLs in Hardware speichern.

Hier ist ein Artikel. http://java.sun.com/developer/technicalArticles/Programming/serialization/

Beantwortet am 27/09/2008 um 02:11
quelle vom benutzer

stimmen
9

Wie wäre es Properties - Dateien in Ihrer Wahl von Codierungen? Gebraucht zu werden, wenn Sie Ihre Eigenschaften geladen, sofern Sie einen Inputstream und das load()Verfahren decodiert es als ISO-8859-1. Sie können die Datei in einem anderen Codierung tatsächlich speichern, aber sie hatte einen widerlichen Hack wie dies nach dem Laden verwenden , um die Daten richtig zu dekodieren:

String realProp = new String(prop.getBytes("ISO-8859-1"), "UTF-8");

Aber, wie von JDK 1.6, gibt es eine load()Methode , die einen Reader anstelle eines Input nimmt, was bedeutet , dass Sie die richtige Codierung von Anfang an verwenden können (es gibt auch eine store()Methode , die einen Writer nimmt). Dies scheint eine ziemlich große Sache für mich, aber es scheint überhaupt ohne Tamtam in das JDK schlich wurden. Ich stolperte nur auf mich vor ein paar Wochen, und eine schnelle Google - Suche aufgedreht nur eines davon erwähnt.

Beantwortet am 24/09/2008 um 20:37
quelle vom benutzer

stimmen
8

Die meisten Menschen nicht wissen, dass sie ein Array klonen.

int[] arr = {1, 2, 3};
int[] arr2 = arr.clone();
Beantwortet am 20/08/2009 um 12:45
quelle vom benutzer

stimmen
8

Die Menschen sind manchmal ein wenig überrascht, wenn sie erkennen, dass es möglich private Methoden und Zugang / ändern private Felder mithilfe von Reflektion nennen ...

Betrachten Sie die folgende Klasse:

public class Foo {
    private int bar;

    public Foo() {
        setBar(17);
    }

    private void setBar(int bar) {
        this.bar=bar;
    }

    public int getBar() {
        return bar;
    }

    public String toString() {
        return "Foo[bar="+bar+"]";
    }
}

Die Ausführung dieses Programms ...

import java.lang.reflect.*;

public class AccessibleExample {
    public static void main(String[] args)
        throws NoSuchMethodException,IllegalAccessException, InvocationTargetException, NoSuchFieldException {
        Foo foo=new Foo();
        System.out.println(foo);

        Method method=Foo.class.getDeclaredMethod("setBar", int.class);
        method.setAccessible(true);
        method.invoke(foo, 42);

        System.out.println(foo);
        Field field=Foo.class.getDeclaredField("bar");
        field.setAccessible(true);
        field.set(foo, 23);
        System.out.println(foo);
    }
}

... wird die folgende Ausgabe ergeben:

Foo[bar=17]
Foo[bar=42]
Foo[bar=23]
Beantwortet am 03/06/2009 um 15:32
quelle vom benutzer

stimmen
8

Annotation Verarbeitungs-API von Java 6 sieht sehr Perspektive für die Codegenerierung und statische Code-Verifikation.

Beantwortet am 29/09/2008 um 12:09
quelle vom benutzer

stimmen
7

Eigentlich, was ich über Java Liebe ist wie wenige versteckte Tricks es gibt. Es ist eine sehr offensichtliche Sprache. So sehr, dass nach 15 Jahren, fast jeder ich denken kann, ist bereits auf diesen wenigen Seiten.

Vielleicht die meisten Menschen wissen, dass Collections.synchronizedList () Synchronisation auf eine Liste erstellt. Was Sie nicht wissen, wenn Sie die Dokumentation zu lesen ist, dass Sie sicher auf den Elementen dieser Liste selbst durch die Synchronisation auf der Liste Objekt laufen können.

CopyOnWriteArrayList könnte zu einigen unbekannt sein und Zukunft stellt eine interessante Art und Weise zu abstrahieren multithreaded Ergebnis Zugang.

Sie können VMs (lokal oder remote) befestigen, Informationen über GC-Aktivität, Speichernutzung, Filedeskriptoren und sogar Größen durch die verschiedene Management, Mittel erhalten Objekt und APIs befestigen.

Obwohl Timeunit als lange vielleicht besser ist, ziehe ich Wicket der Dauer-Klasse.

Beantwortet am 26/11/2009 um 19:43
quelle vom benutzer

stimmen
7

Sie können einen String sprintf-Stil bauen String.format () verwenden.

String w = "world";
String s = String.format("Hello %s %d", w, 3);

Sie können natürlich auch spezielle Bezeich verwenden, um die Ausgabe zu ändern.

Mehr hier: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax

Beantwortet am 04/02/2009 um 17:52
quelle vom benutzer

stimmen
7

Sie können endgültige lokale Variablen und Parameter in Initialisierungsblöcke und Methoden lokaler Klassen zugreifen. Bedenken Sie:

    final String foo = "42";
    new Thread() {
        public void run() {
             dowhatever(foo);
        }
    }.start();

Ein bisschen wie ein Verschluss, ist es nicht?

Beantwortet am 23/10/2008 um 15:18
quelle vom benutzer

stimmen
7

Die Leistung , die Sie über den Garbage Collector haben können und wie sie verwaltet Sammlung Objekt ist sehr mächtig, vor allem für Langlauf und zeitkritische Anwendungen. Es beginnt mit schwach, weich und Phantom Referenzen im java.lang.ref Paket. Werfen Sie einen Blick auf diejenigen, vor allem für Gebäude - Caches (eine java.util.WeakHashMap ist bereits). Nun ein wenig tiefer in die Reference graben und Sie beginnen noch mehr Kontrolle haben. Greift schließlich die Dokumentation auf dem Garbage Collector selbst und Sie werden in der Lage zu kontrollieren , wie oft es läuft, Größen verschiedenen Sammlungsbereiche, und die Art der verwendeten Algorithmen (für Java 5 sehen http://java.sun.com/docs /hotspot/gc5.0/gc_tuning_5.html ).

Beantwortet am 17/09/2008 um 18:37
quelle vom benutzer

stimmen
7

Jvisualvm aus dem Verzeichnis ist in der Verteilung JDK. Überwachung und sogar jede Java-Anwendung Profilieren, auch von Ihnen nicht mit speziellen Parametern starten haben. Erst in den letzten Versionen des Java 6SE JDK.

Beantwortet am 15/09/2008 um 17:19
quelle vom benutzer

stimmen
6

Lasen nicht darüber

Integer a = 1;
Integer b = 1;
Integer c = new Integer(1);
Integer d = new Integer(1);

Integer e = 128;
Integer f = 128;

assertTrue (a == b);   // again: this is true!
assertFalse(e == f); // again: this is false!
assertFalse(c == d);   // again: this is false!

Lesen Sie mehr über diese von Java Becken von Integer (intern ‚Cache‘ von -128 bis 127 für Autoboxing) suchen oder schauen Sie in Integer.valueOf

Beantwortet am 22/01/2010 um 23:33
quelle vom benutzer

stimmen
6

Quellcode-URLs. Zum Beispiel hier einig rechtlicher Java-Quellcode:

http://google.com

(Ja, das war es in Java Puzzlers. Ich lachte ...)

Beantwortet am 12/05/2009 um 04:47
quelle vom benutzer

stimmen
6

Instanzen derselben Klasse können private Mitglieder anderer Instanzen zugreifen:

class Thing {
  private int x;

  public int addThings(Thing t2) {
    return this.x + t2.x;  // Can access t2's private value!
  }
}
Beantwortet am 26/11/2008 um 20:04
quelle vom benutzer

stimmen
6

Einige Steuerfluss Tricks, finallyum eine returnAussage:

int getCount() { 
  try { return 1; }
  finally { System.out.println("Bye!"); }
}

Die Regeln für die eindeutige Zuordnung prüft, ob eine endgültige Variable immer durch eine einfache Steuerung-Flow - Analyse zugeordnet:

final int foo;
if(...)
  foo = 1;
else
  throw new Exception();
foo+1;
Beantwortet am 15/09/2008 um 17:08
quelle vom benutzer

stimmen
6

Joshua Blochs neue Effective Java ist eine gute Ressource.

Beantwortet am 08/09/2008 um 14:24
quelle vom benutzer

stimmen
5

Java 6 (von Sun) kommt mit einem eingebetteten JavaScrip Interpreter.

http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine

Beantwortet am 14/01/2010 um 12:59
quelle vom benutzer

stimmen
5

Comma & Array. Es ist legal , Syntax: String s [] = {
"123",
"234" ,
};

Beantwortet am 20/08/2009 um 11:06
quelle vom benutzer

stimmen
5

Es wurde bereits erwähnt , dass eine endgültige Anordnung eine Variable aus der anonymen inneren Klassen zu übergeben verwendet werden kann.

Ein weiterer, wohl besser und weniger hässlich Ansatz ist allerdings AtomicReference (oder AtomicBoolean / Atomicinteger / ...) Klasse von java.util.concurrent.atomic Paket zu verwenden.

Einer der Vorteile dabei ist , dass diese Klassen auch solche Verfahren , wie liefern compareAndSet, die nützlich sein können , wenn Sie mehrere Threads sind zu schaffen , die die gleiche Variable ändern können.


Ein weiteres nützliches verwandten Muster:

final AtomicBoolean dataMsgReceived = new AtomicBoolean(false);
final AtomicReference<Message> message = new AtomicReference<Message>();
withMessageHandler(new MessageHandler() {
    public void handleMessage(Message msg) {
         if (msg.isData()) {
             synchronized (dataMsgReceived) {
                 message.set(msg);
                 dataMsgReceived.set(true);
                 dataMsgReceived.notifyAll();
             }
         }
    }
}, new Interruptible() {
    public void run() throws InterruptedException {
        synchronized (dataMsgReceived) {
            while (!dataMsgReceived.get()) {
                dataMsgReceived.wait();
            }
        }
    }
});

In diesem speziellen Beispiel könnten wir einfach auf Nachricht gewartet haben es nicht null zu werden, kann jedoch null oft ein gültiger Wert sein und dann müssen Sie eine separate Flag verwenden, um die Wartezeit zu beenden.

waitMessageHandler(…)oben ist noch ein weiteres nützliches Muster: es setzt einen Handler irgendwo, dann startet die Ausführung Unterbrechbare die eine Ausnahme auslösen kann, und entfernt dann den Handler in der finally - Block, etwa so:

private final AtomicReference<MessageHandler> messageHandler = new AtomicReference<MessageHandler>();
public void withMessageHandler(MessageHandler handler, Interruptible logic) throws InterruptedException {
    synchronized (messageHandler) {
        try {
            messageHandler.set(handler);
            logic.run();
        } finally {
            messageHandler.set(null);
        }
    }
}

Hier gehe ich davon aus, dass die message ‚s (wenn es nicht null) handleMessage(…)Methode von einem anderen Thread aufgerufen wird , wenn eine Nachricht empfangen wird. message darf nicht einfach von seinem Messagetyp: auf diese Weise Sie auf einem mir ändernde Variable synchronisieren, was eindeutig ein Fehler ist.

Natürlich braucht es nicht zu sein InterruptedException , könnte es so etwas wie IOException , oder was auch immer Sinn in einem bestimmten Stück Code macht.

Beantwortet am 14/08/2009 um 10:35
quelle vom benutzer

stimmen
5

Lesen Sie „Java Puzzlers“ von Joshua Bloch und Sie werden beide erleuchtet und entsetzt sein.

Beantwortet am 20/04/2009 um 04:26
quelle vom benutzer

stimmen
5

Kreuzungstypen ermöglichen es Ihnen, (ein bisschen sorta) tun Aufzählungen, die eine Vererbungshierarchie haben. Sie können Implementierung nicht erben, aber man kann es auf eine Hilfsklasse delegieren.

enum Foo1 implements Bar {}
enum Foo2 implements Bar {}

class HelperClass {
   static <T extends Enum<T> & Bar> void fooBar(T the enum) {}
}

Dies ist nützlich, wenn Sie eine Reihe von verschiedenen Aufzählungen, die irgendeine Art von Muster zu implementieren. Zum Beispiel kann eine Anzahl von Paaren von Aufzählungen, die eine Eltern-Kind-Beziehung.

enum PrimaryColor {Red, Green, Blue;}
enum PastelColor {Pink, HotPink, Rockmelon, SkyBlue, BabyBlue;}

enum TransportMedium {Land, Sea, Air;}
enum Vehicle {Car, Truck, BigBoat, LittleBoat, JetFighter, HotAirBaloon;}

Sie können generische Methoden schreiben, die sagen: „Ok, da ein ENUM-Wert das ist ein Elternteil von einigen anderen ENUM-Werte, wie viel Prozent aller möglichen Kind Aufzählungen des Kindes Art dieses bestimmten Stamm Wert als ihre Eltern haben?“, Und haben sie alle typsicher und getan, ohne zu Gießen. (ZB: das „Meer“ ist 33% aller möglichen Fahrzeuge, und „Green“ 20% aller möglichen Pastels).

Der Code sieht wie folgt aus. Es ist ziemlich eklig, aber es gibt Möglichkeiten, es besser zu machen. Beachten Sie in particuar, dass die „Blatt“ Klassen selbst recht ordentlich sind - die allgemeinen Klassen Erklärungen haben die schrecklich hässlich sind, aber Sie sie nur onece schreiben. Sobald die generischen Klassen geben, dann verwenden sie einfach.

import java.util.EnumSet;

import javax.swing.JComponent;

public class zz extends JComponent {

    public static void main(String[] args) {
        System.out.println(PrimaryColor.Green + " " + ParentUtil.pctOf(PrimaryColor.Green) + "%");
        System.out.println(TransportMedium.Air + " " + ParentUtil.pctOf(TransportMedium.Air) + "%");
    }


}

class ParentUtil {
    private ParentUtil(){}
    static <P extends Enum<P> & Parent<P, C>, C extends Enum<C> & Child<P, C>> //
    float pctOf(P parent) {
        return (float) parent.getChildren().size() / //
                (float) EnumSet.allOf(parent.getChildClass()).size() //
                * 100f;
    }
    public static <P extends Enum<P> & Parent<P, C>, C extends Enum<C> & Child<P, C>> //
    EnumSet<C> loadChildrenOf(P p) {
        EnumSet<C> cc = EnumSet.noneOf(p.getChildClass());
        for(C c: EnumSet.allOf(p.getChildClass())) {
            if(c.getParent() == p) {
                cc.add(c);
            }
        }
        return cc;
    }
}

interface Parent<P extends Enum<P> & Parent<P, C>, C extends Enum<C> & Child<P, C>> {
    Class<C> getChildClass();

    EnumSet<C> getChildren();
}

interface Child<P extends Enum<P> & Parent<P, C>, C extends Enum<C> & Child<P, C>> {
    Class<P> getParentClass();

    P getParent();
}

enum PrimaryColor implements Parent<PrimaryColor, PastelColor> {
    Red, Green, Blue;

    private EnumSet<PastelColor>    children;

    public Class<PastelColor> getChildClass() {
        return PastelColor.class;
    }

    public EnumSet<PastelColor> getChildren() {
        if(children == null) children=ParentUtil.loadChildrenOf(this);
        return children;
    }
}

enum PastelColor implements Child<PrimaryColor, PastelColor> {
    Pink(PrimaryColor.Red), HotPink(PrimaryColor.Red), //
    Rockmelon(PrimaryColor.Green), //
    SkyBlue(PrimaryColor.Blue), BabyBlue(PrimaryColor.Blue);

    final PrimaryColor  parent;

    private PastelColor(PrimaryColor parent) {
        this.parent = parent;
    }

    public Class<PrimaryColor> getParentClass() {
        return PrimaryColor.class;
    }

    public PrimaryColor getParent() {
        return parent;
    }
}

enum TransportMedium implements Parent<TransportMedium, Vehicle> {
    Land, Sea, Air;

    private EnumSet<Vehicle>    children;

    public Class<Vehicle> getChildClass() {
        return Vehicle.class;
    }

    public EnumSet<Vehicle> getChildren() {
        if(children == null) children=ParentUtil.loadChildrenOf(this);
        return children;
    }
}

enum Vehicle implements Child<TransportMedium, Vehicle> {
    Car(TransportMedium.Land), Truck(TransportMedium.Land), //
    BigBoat(TransportMedium.Sea), LittleBoat(TransportMedium.Sea), //
    JetFighter(TransportMedium.Air), HotAirBaloon(TransportMedium.Air);

    private final TransportMedium   parent;

    private Vehicle(TransportMedium parent) {
        this.parent = parent;
    }

    public Class<TransportMedium> getParentClass() {
        return TransportMedium.class;
    }

    public TransportMedium getParent() {
        return parent;
    }
}
Beantwortet am 22/02/2009 um 08:22
quelle vom benutzer

stimmen
5

Die nächste Generation des Java-Plug-in Java 1.6 Update gefunden 10 und später hat einige sehr nette Features:

  • Übergeben Sie java_arguments Parameter Argumente an die JVM übergeben, die erstellt wird. Auf diese Weise können Sie die Größe des Speichers an das Applet gegeben steuern.
  • Erstellen Sie separate Klassenlader oder sogar separate JVM für jedes Applet.
  • Geben Sie die JVM-Version zu verwenden.
  • Installieren Teil Java-Kernel in Fällen, in denen Sie nur eine Teilmenge der vollständigen Java-Bibliotheken -Funktionalität benötigen.
  • Bessere Vista-Unterstützung.
  • Unterstützung (experimentell) ein Applet aus dem Browser ziehen und ihn am Laufen halten, wenn Sie weg navigieren.

Viele andere Dinge , die hier dokumentiert sind: http://jdk6.dev.java.net/plugin2/

Mehr von dieser Version hier: http://jdk6.dev.java.net/6u10ea.html

Beantwortet am 04/02/2009 um 16:58
quelle vom benutzer

stimmen
5

String Parametrierter Class Factory.

Class.forName( className ).newInstance();

Legen Sie eine Ressource (Property - Datei, XML, XSLT, Bild usw.) von der Bereitstellung JAR - Datei .

this.getClass().getClassLoader().getResourceAsStream( ... ) ;
Beantwortet am 26/09/2008 um 14:06
quelle vom benutzer

Beantwortet am 08/09/2008 um 17:38
quelle vom benutzer

stimmen
4

Sie können Laufzeitprüfungen von generischen Typen mit einem Add - Class<T>Objekt, kommt dies praktisch , wenn eine Klasse in einer Konfigurationsdatei irgendwo erstellt wird , und es gibt keine Möglichkeit , eine Kompilierung Prüfung für den generischen Typen der Klasse hinzuzufügen. Sie brauchen nicht die Klasse wollen zur Laufzeit die Luft zu sprengen , wenn die App falsch konfiguriert werden , geschieht und Sie nicht alles , was Sie Klassen mit Instanz überprüft gespickt wollen.

public interface SomeInterface {
  void doSomething(Object o);
}
public abstract class RuntimeCheckingTemplate<T> {
  private Class<T> clazz;
  protected RuntimeChecking(Class<T> clazz) {
    this.clazz = clazz;
  }

  public void doSomething(Object o) {
    if (clazz.isInstance(o)) {
      doSomethingWithGeneric(clazz.cast(o));
    } else {
      // log it, do something by default, throw an exception, etc.
    }
  }

  protected abstract void doSomethingWithGeneric(T t);
}

public class ClassThatWorksWithStrings extends RuntimeCheckingTemplate<String> {
  public ClassThatWorksWithStrings() {
     super(String.class);
  }

  protected abstract void doSomethingWithGeneric(T t) {
    // Do something with the generic and know that a runtime exception won't occur 
    // because of a wrong type
  }
}
Beantwortet am 03/03/2010 um 16:17
quelle vom benutzer

stimmen
4

Sie können (diese) wechseln innerhalb Methodendefinitionen von Enum-Klassen. Machte mich schreien „whut!“ laut, als ich entdeckte, dass dies tatsächlich funktioniert.

Beantwortet am 26/11/2009 um 18:57
quelle vom benutzer

stimmen
4

Offenbar mit einigen Debug baut es eine Option, die das native (JIT) Assembler - Code von HotSpot - Dumps: http://weblogs.java.net/blog/kohsuke/archive/2008/03/deep_dive_into.html

Leider war ich nicht in der Lage den Build über den Link in diesem Posten zu finden, wenn jemand eine präzisere URL finden, würde ich gerne mit ihm spielen.

Beantwortet am 03/12/2008 um 07:21
quelle vom benutzer

stimmen
4

Swingworker für die einfache Benutzeroberfläche Rückrufe von Hintergrund - Threads zu verwalten.

Beantwortet am 20/11/2008 um 21:19
quelle vom benutzer

stimmen
4

Functors sind ziemlich cool. Sie sind ziemlich nah an einen Funktionszeiger, die jedes in der Regel schnell zu sagen ist unmöglich, in Java.

Functors in Java

Beantwortet am 29/08/2008 um 20:36
quelle vom benutzer

stimmen
3

Vor einigen Jahren, als ich hatte Java zu tun (1.4.x) ich eine eval () -Methode wollte und Sonnen javac ist (war?) In Java geschrieben, so dass es einfach war zu verknüpfen tools.jar und verwendet, die mit handelsüblichem Klebstoff-Code um es.

Beantwortet am 04/10/2008 um 22:05
quelle vom benutzer

stimmen
3

Da niemand sonst es noch gesagt hat (glaube ich) meine Lieblings-Funktion Auto-Box ist!

public class Example
{
    public static void main(String[] Args)
    {
         int a = 5;
         Integer b = a; // Box!
         System.out.println("A : " + a);
         System.out.println("B : " + b);
    }
}
Beantwortet am 20/09/2008 um 05:14
quelle vom benutzer

stimmen
2

Sie können eine Methode außer Kraft setzen und haben die Oberklassenkonstruktors es nennen (dies kann als eine Überraschung für C ++ Programmierer kommen.)

Beispiel

Beantwortet am 25/01/2010 um 08:20
quelle vom benutzer

stimmen
1

Ich genoss

  1. javadoc ‚s taglet und doclet , die es uns ermöglichen , javadoc Ausgabe anpassen.
  2. JDK - Tools : jstat, jstack usw.
Beantwortet am 29/01/2009 um 18:44
quelle vom benutzer

stimmen
0

Java Bean Eigenschaftenaccessor Methoden werden nicht anfangen müssen mit „get“ und „set“.

Auch bekommt Josh Bloch das falsch in Effective Java.

Beantwortet am 22/06/2009 um 16:10
quelle vom benutzer

stimmen
-3

Ich war überrascht, als ich zum ersten Mal des Ternary-Operator bemerkt, die eine einfache if-then-else-Anweisung entspricht:

minVal = (a < b) ? a : b;
Beantwortet am 09/04/2010 um 13:15
quelle vom benutzer

stimmen
-8

Überrascht mich, dass eine Schnittstelle mehrere Schnittstellen erweitern können, aber Klasse kann nur eine Klasse erweitern.

Beantwortet am 03/12/2009 um 08:08
quelle vom benutzer

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