Switch Fällen maximale Umsetzung?
Ich bin mit einer Einzel-switch-Fälle mehr als 100 Fälle-Anweisung verwendet werden. Gibt es irgendeine Grenze ?
Die Nutzung der Fälle für die Vorschläge meiner AutoCompleteTextView, android-tutorial.
Hier ein Teil meines codes, ignorieren die Badrul.class Sie wird später noch geändert werden.
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Toast;
public class Search extends Activity
{
public void onCreate(Bundle savedInstanceSate)
{
final AutoCompleteTextView autoComplete;
super.onCreate(savedInstanceSate);
setContentView(R.layout.searchshop);
autoComplete = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, shops);
autoComplete.setAdapter(adapter);
autoComplete.setThreshold(1);
autoComplete.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)
{
int index=999;
for(int i=0;i<shops.length;i++)
{
if(autoComplete.getText().toString().trim().equals(shops[i]))
{
index=i;
break;
}
}
switch(index)
{
case 0:
startActivity(new Intent(Search.this, Adidas.class));
break;
case 1:
startActivity(new Intent(Search.this, Affin.class));
break;
case 2:
startActivity(new Intent(Search.this, AlamArt.class));
break;
case 3:
startActivity(new Intent(Search.this, AlAmin.class));
break;
case 4:
startActivity(new Intent(Search.this, Anakku.class));
break;
case 5:
startActivity(new Intent(Search.this, Anggerik.class));
break;
case 6:
startActivity(new Intent(Search.this, Asiari.class));
break;
case 7:
startActivity(new Intent(Search.this, AsterSpring.class));
break;
case 8:
startActivity(new Intent(Search.this, Audrey.class));
break;
case 9:
startActivity(new Intent(Search.this, Badrul.class));
break;
case 10:
startActivity(new Intent(Search.this, Badrul.class));
break;
case 11:
startActivity(new Intent(Search.this, Badrul.class));
break;
default:
Toast.makeText(Search.this, "Invalid Selection", Toast.LENGTH_SHORT).show();
}
}
});
}
static final String[] shops = new String[]
{
"Adidas", "Affin Bank ATM", "Alam Art Gallery", "Al Amin Kids", "Anakku", "Anggerik", "Asiari",
"Aster Spring", "Audrey", "Badrul Songket", "Bata"};
}
- Ich Frage mich, ob es eine bessere Lösung für dein problem... kannst du etwas code?
- Nur stellen Sie sicher, dass es kein entweder-Ansatz, wie die Verwendung von OOP
- Ich kenne keine technische Grenze beschränken würde Sie zu mehr als 100 Fällen (es sei denn, Sie haben Millionen von Ihnen, in welchem Fall einige andere Grenzen wie memory, code-Größe, etc. möglicherweise wirksam). Allerdings, wenn Sie haben, dass viele Fälle es sich lohnen könnte zu der Frage der Gestaltung und Aussehen für einige die bessere option. In diesem Fall möchten Sie vielleicht geben Sie einige weitere Informationen in der switch-Anweisung.
- wie Thomas sagte, die änderung im design kann lösen ur problem
- Vielleicht ein XY-Problem?
- Meine aktualisierten codes.
- Ich denke, dass Vererbung kann dir helfen... 🙂
- wenn Sie dont Geist zu mir, ich bin neu in der Programmierung. :O
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code unhandlich werden, bevor Sie auf jedem limit, das Java erlegt.
Haben Sie als refactoring der code? Je nachdem, was die switch-Anweisung ist entworfen, um zu erreichen können Sie entweder:
So, in Ihrem Fall, Sie wäre besser dran, definieren Sie eine statische
Map
der index-Werte zuClasses
:Dadurch wird der code in
onItemClick()
leichter zu Lesen. Sie konnten gehen Sie einen Schritt weiter und definieren ein eigenesstartActivity()
Methode, die den index verwendet werden, und enthält alle die switch-Anweisung Ersatz-code.Schalter funktioniert gut mit byte, short, char und int. So haben Sie die Einschränkung von int-Werten + Standard. Von hier
Aber ich schlage vor, zu denken, mehr über die Architektur. Es ist besser zu organisieren einige interface 'performer' und implementieren Sie einige Anzahl der Darsteller (könnte als innere Klassen). Dann müssen Sie nur ein array(Karte), wo Sie die Bedingungen und Instanzen von diesem Interpreten. Die Idee ist die Trennung der Daten von Algorithmus.
Auch yo kann versuchen, andere zu finden-Muster für, die
Gibt es eine Begrenzung für die maximale Methode length: Maximale Größe einer Methode in java?
Sonst, als ein Beispiel, ein
switch
mit 1000 Fällen von der formcase
n: System.out.println(
n); break;
scheint zu funktionieren. Der generierte bytecode verwendet eine
tableswitch
Unterricht, was bedeutet, dass es gar nicht ineffizient sein.Natürlich, es sei denn es ist automatisch generierter code, dieser wird verpönt sein.
Denken Sie an alternativen, wie zum Beispiel:
Edit:
Blick auf Ihren code, es scheint, da alle Ihre case-Anweisungen führen Sie die exakt gleiche Art von code, alles, was Sie brauchen, ist ein
Class[]
zugegriffenindex
so etwas wie:Und natürlich, es wäre schöner, wenn es eine Möglichkeit zu erzeugen, diese Klassen auf eine andere Weise, wenn Sie sagen, hatte
Adidas
undAffin
Objekte, und Sie liefgetClass()
auf Sie, oder wenn Sie hatten Ihre Namen auf eine Liste und könnte- Klasse.Vorname
.Oder Sie können einen Blick auf das Strategie-Muster. Zum Beispiel:
Wenn es sieht jetzt wie folgt aus:
Können Sie umgestalten, es mit dem Strategie-Muster vielleicht so:
Happy coding!
Dave
Bei der Umsetzung schaltet viele Optimierungen vorgenommen werden, für die Leistung, ansonsten müssen Sie Liste über alle Schalter, bis es passt.
Was ich tun würde, hier ist ein Haupt Schalter für das erste Zeichen dann nested-Schalter im inneren, also wenn die Wahl war z-es muss nicht loop-check jeden ersten Namen
Einen anderen Weg zu brechen, Ihre switch-Anweisung in kleinere gleich große Aussagen. Dies ist schneller, aufgrund der Art und Weise der bytecode kompiliert wird (ref Java-performance-tuning - shirazi)
Einem geeignet Programm ist das verschieben/umbauen, dass der code "Kette der Verantwortung prasseln gegeben, dass diese switch-Anweisungen sind nicht einfach zurück, einige der Verarbeitung beteiligt ist, auf Sie und so weiter.
Glaube ich, dass Sie nicht haben, verwenden Sie bei Guave Reicht auch (In anderen Worten, Sie sind mit jeweils einem descret, nicht eine gemeinsame Verarbeitung auf zwei (mehr als eine) Fall.
Ich weiß nicht genau, was Ihre
startActivity()
Methode tun, wissen gar nicht, wie dieIntent
Objekt implementiert ist, aber ich denke, eine alternative Möglichkeit um Ihr Problem zu lösen sein könnte:Shop
(zum Beispiel);Adidas
oderAffin
von ihm;startActivity()
- Methode für jede Klasse;Beispiel:
Dann für jede Klasse...
Schließlich, in Ihrem client-code