Ich habe Java vor kurzem gelernt und kam zu der folgenden Schlussfolgerung: Deklaration eines statisch geschachtelten Typs ist eine sinnlose Redundanz.Java Static Verschachtelte Typ Semantic
ich die Antworten auf die Frage unten zu lesen und während ich die Antworten verstehe ich (und es gelöscht meine inetial Verwirrung - ähnlich dem der Fragesteller hatte) Can a Static Nested Class be Instantiated Multiple Times? ich auch zu dem Schluss, dass das Wort statisch in Bezug auf einen inneren Typ ist bedeutungslos, zum Beispiel, wenn wir den inneren Typ nicht als statisch deklariert haben, müssen wir den äußeren Typ nicht instanziieren, um neue Objekte des inneren Typs erstellen zu können. Nach all dem ist ein verschachtelter Typ und kein Mitglied/eine Variable vom äußeren Typ. Ich habe gerade einen Code getestet (statische entfernt) und meine Annahme war richtig.
Gibt es etwas, das ich vermisst habe?
hier ist der Code, den ich getestet (Hinweis, wenn ich Static von KeyEvent Typ innerhalb IGameInput entfernt, fein alles funktionierte)
package FrameWork;
import java.util.List;
public interface IGameInput {
//type definitions
public static class KeyEvent {
public static final int KEY_DOWN = 0;
public static final int KEY_UP = 1;
public int type;
public int keyCode;
public char keyChar;
}
}
//////////////// ///////
package FrameWork.Imp;
import java.util.ArrayList;
import java.util.List;
/*
*/
public class Pool<T>
{
public interface PoolObjectFactory<T> {
public T createObject();
}
private final ArrayList<T> freeObjects;
private final PoolObjectFactory<T> factory;
private final int maxSize;
public Pool(PoolObjectFactory<T> factory, int maxSize)
{
this.factory = factory;
this.maxSize = maxSize;
this.freeObjects = new ArrayList<T>(maxSize);
}
public T newObject()
{
T object = null;
if (freeObjects.size() == 0)
{
object = factory.createObject();
}
else
{
object = freeObjects.remove(freeObjects.size() - 1);
}
return object;
}
public void free(T object)
{
if (freeObjects.size() < maxSize)
{
freeObjects.add(object);
}
}
}
////////////////////////
package FrameWork.Imp;
import java.util.ArrayList;
import java.util.List;
import android.view.View;
import android.view.View.OnKeyListener;
import FrameWork.IGameInput.KeyEvent;
import FrameWork.Imp.Pool.PoolObjectFactory;
public class KeyboardHandler implements OnKeyListener {
boolean[] pressedKeys = new boolean[128];
Pool<KeyEvent> keyEventPool;
List<KeyEvent> keyEventsBuffer = new ArrayList<KeyEvent>();
List<KeyEvent> keyEvents = new ArrayList<KeyEvent>();
public KeyboardHandler(View view) {
PoolObjectFactory<KeyEvent> factory;
factory =
new PoolObjectFactory<KeyEvent>() {
@Override
public KeyEvent createObject() {
return new KeyEvent();
}
};
keyEventPool = new Pool<KeyEvent>(factory, 100);
view.setOnKeyListener(this);
view.setFocusableInTouchMode(true);
view.requestFocus();
}
@Override
public boolean onKey(View v, int keyCode, android.view.KeyEvent event) {
if (event.getAction() == android.view.KeyEvent.ACTION_MULTIPLE) return false;
synchronized (this) {
KeyEvent keyEvent = keyEventPool.newObject();
keyEvent.keyCode = keyCode;
keyEvent.keyChar = (char) event.getUnicodeChar();
if (event.getAction() == android.view.KeyEvent.ACTION_DOWN) {
keyEvent.type = KeyEvent.KEY_DOWN;
if (keyCode > 0 && keyCode < 127) pressedKeys[keyCode] = true;
}
if (event.getAction() == android.view.KeyEvent.ACTION_UP) {
keyEvent.type = KeyEvent.KEY_UP;
if (keyCode > 0 && keyCode < 127) pressedKeys[keyCode] = false;
}
keyEventsBuffer.add(keyEvent);
}
return false;
}
}
_und meine Annahme war richtig_ Sie müssen etwas falsch gemacht haben. Sie können innere Typen (verschachtelt ohne 'statisch') ohne umschließende Instanz nicht instanziieren. – Savior
Sind Sie sicher, dass Sie nicht aus einer Instanz instanziieren? – shmosel
* Gibt es etwas, das ich vermisst habe? *: Ja: der Code und die Erklärung, wie Sie zu diesem Schluss gekommen sind. –