2017-01-25 5 views
-3

私が学んだことは、オブジェクトを作成するために新しいものが必須であるということです。このコード行は(Javaスイングの)どのように機能しますか?なぜならGraphicsEnvironment型を返すgetLocalGraphicsEnvironment方法のstatic実装である次のコード行は、new演算子を使用せずにオブジェクトを作成する方法はありますか?

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
+5

メソッドを呼び出しています。このメソッドの中には、 'GraphicsEnvironment'オブジェクトを取得または作成して返す方法があります。このメソッドは、オブジェクトがどのように作成されたかについて責任を負います。あなたはそれを作成していません。 – khelwood

+0

オブジェクトを作成中ではありません。その関数はです。 – SLaks

+0

のように、GraphicsEnvironmentクラスには 'static'修飾子が必要です。静的クラスのみのメソッドはクラス名を直接使用して呼び出すことができるためです。 – trotsky

答えて

0

private static GraphicsEnvironment createGE() { 
    GraphicsEnvironment ge; 
    String nm = AccessController.doPrivileged(new GetPropertyAction("java.awt.graphicsenv", null)); 
    try { 
     // long t0 = System.currentTimeMillis(); 
     Class<GraphicsEnvironment> geCls; 
     try { 
      // First we try if the bootclassloader finds the requested 
      // class. This way we can avoid to run in a privileged block. 
      geCls = (Class<GraphicsEnvironment>)Class.forName(nm); 
     } catch (ClassNotFoundException ex) { 
      // If the bootclassloader fails, we try again with the 
      // application classloader. 
      ClassLoader cl = ClassLoader.getSystemClassLoader(); 
      geCls = (Class<GraphicsEnvironment>)Class.forName(nm, true, cl); 
     } 
     ge = geCls.newInstance(); 
     // long t1 = System.currentTimeMillis(); 
     // System.out.println("GE creation took " + (t1-t0)+ "ms."); 
     if (isHeadless()) { 
      ge = new HeadlessGraphicsEnvironment(ge); 
     } 
    } catch (ClassNotFoundException e) { 
     throw new Error("Could not find class: "+nm); 
    } catch (InstantiationException e) { 
     throw new Error("Could not instantiate Graphics Environment: " 
         + nm); 
    } catch (IllegalAccessException e) { 
     throw new Error ("Could not access Graphics Environment: " 
         + nm); 
    } 
    return ge; 
} 

それは実際にオブジェクトを直接作成するnewを呼び出すことはありませんしながら:ここ

private static GraphicsEnvironment localEnv; 
+0

しかし、オブジェクトをどのように作成していますか? ;) – Kayaman

+0

ええと...正確に..オブジェクトを作成するには、メソッドが同じコードでなければなりません、そうですか? – trotsky

+0

'createGE()'はそれを行うものです。新しいオペレータがメソッド呼び出しの連鎖のどこかで呼び出されているわけではありません。この例では、オブジェクトがリフレクションを使用して作成されるので、newは決して直接呼び出されませんが、 – Brendan

0

createGE()からのコードです - localEnvは次のように宣言されている

/** 
* Returns the local <code>GraphicsEnvironment</code>. 
* @return the local <code>GraphicsEnvironment</code> 
*/ 
public static synchronized GraphicsEnvironment getLocalGraphicsEnvironment() { 
    if (localEnv == null) { 
     localEnv = createGE(); 
    } 

    return localEnv; 
} 

からclass itself, definitionなどからそれはリフレクションを使用してGraphicsEnvironmentを作成するためです。この場合、newInstance()を呼び出すと、Headlessを実行していない限り、使用しているクラスの新しいインスタンスが作成されます。その時点ではnewというキーワードで直接作成されます。

+0

ありがとう – trotsky

関連する問題