在使用instanceof编译片段时是否可以使用switch语句

时间:2016-08-25 07:37:20

标签: java android android-fragments

我有几个片段在布局中被替换。有时我需要在布局中找出当前片段的对象。以下是我的表现:

Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragmentContainer);

if (currentFragment instanceof Fragment1) {
     //...
} else if (currentFragment instanceof Fragment2) {
     //...
} else if (currentFragment instanceof Fragment3) {
     //...
} else if (currentFragment instanceof Fragment4) {
    //...
}

在这种情况下是否可以使用switch statemet?

3 个答案:

答案 0 :(得分:0)

不幸的是,没有。

正如他们在交换机文档中所说,

  

开关适用于   byte,short,char和int原始数据类型。它也适用   枚举类型(在枚举类型中讨论),String类和a   包含某些原始类型的特殊类:Character,   字节,短整数和整数(在数字和字符串中讨论)。

这是因为交换机需要一个“switch (month) { case 1: break; ... ”值,这个值是静态的,永远不会改变。

例如,您可以执行以下操作:

switch (month) {
        case object.intvalue: break;
...

但是你将无法做到这样的事情:

istanceof

因为intvalue的值不是静态的。

同样的概念是{{1}}。

答案 1 :(得分:0)

请勿使用开关。使用访客模式。或至少类似的东西:

在Fragment中,为Activity调用

实现一个方法
Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragmentContainer);
// Maybe check if the Fragment actually implements the interface before casting or enclose in try/catch
((IFragmentSpecificStuffHandler)currentFragment).visit(this);

你的片段会用特定的东西来实现这个界面。

在活动中,您将替换if / else by:

interface IVisitor{
    void visit( Fragment1 f ); // <- These correspond to your "if instanceof" - branches
    void visit( Fragment2 f );
    void visit( Fragment3 f );
}

interface IVisitable{
     void accept( IVisitor visitor );
}

但是你应该考虑更好的命名。

所以基本上你要把责任推到每个Fragment-Variation到Fragment-Variation上。这有一些优点:

  • 您的活动代码更清晰(如果/ elseif / else,则不难看)
  • 没有不稳定的班级平等检查
  • 如果您以后添加另一个Fragment-Type,您只需在那里实现接口(无需更改活动代码)。
  • ...

如果您想要或必须在活动中保留该代码,您可以进行双重调度:

IVisitor

在您的活动中,实施public void visit(Fragment1 f){ //code for Fragment1 // what you would have written inside the if-body } public void visit(Fragment2 f){ //code for Fragment2 } public void visit(Fragment3 f){ //code for Fragment3 }

Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragmentContainer);
((IVisitable)currentFragment).accept(this); // Dispatch #1

在if / elsif / else的位置:

IVisitable

在您的片段中,您将实施//... we are in Fragment1 public void accept( IVisitor visitor ){ visitor.visit(this); /* Dispatch #2 just callback into visitor, * will automatically call the correct * visit( x ) impl. in Activity.*/ }

{{1}}

后一种方法是“访客模式”的精确实现,并且在活动字段的可见性方面具有一些优势。如果稍后添加片段,除了创建之外,您将不得不更改界面并触摸活动。就个人而言,我经常发现答案开头的“快捷方式”版本已经足够,但这取决于你想做什么。

答案 2 :(得分:0)

在这种情况下不可能使用switch case,因为switch case适用于可以赋予多个值的单个表达式。你试图解决的问题是不同的,你想要不同的表达式与值集(真/假)。在这种情况下,您需要每次评估不同的表达式,可以是真或假。