我需要确定是否InetSocketAddress有效地使用IPv6或IPv4.我能看到的唯一两种方法是使用instanceof运算符,或者检查getAddress()(应该返回a byte[])的长度.这两个都不太理想(instanceof很慢,并且getAddress必须制作数组的副本).
还有更好的选择吗?
我有一个数组列表:
private List<GameObject> gameObjects = new CopyOnWriteArrayList<GameObject>();
Run Code Online (Sandbox Code Playgroud)
GameObject可以是3类中的一个:Spaceship,Beam和Asteroid.它们都很相似所以我将它们保存在一个数组中.然而,太空飞船有另外的方法射击,在其他线程(被称为ShootRunnable)中每100ms使用一次.所以我想迭代它,Spaceship因为其他没有实现射击方法.实现这一目标的最佳方法是什么?
for (GameObject ob : gameObjects) {
if (ob instanceof Spaceship) {
ob.shoot();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用上面的内容迭代它吗?只是使用演员或其他什么?请帮忙.
我需要存储很多属于不同类的对象:
ClassA {...}
ClassA1 extends ClassA {...}
ClassA2 extends ClassA {...}
ClassA2a extends ClassA2 {...}
ClassB {...}
Run Code Online (Sandbox Code Playgroud)
现在,我需要找到一种方法来存储所有这些对象,从而使我能够有效地获取属于特定类及其继承的子类的所有对象。例如,这个假想代码
getObjects(ClassA2)
Run Code Online (Sandbox Code Playgroud)
将返回属于ClassA2或ClassA2a的所有存储对象的列表。
我相信某种树集合将是合适的,但是我想不出任何实现它的方法。有任何想法吗?
(背景:我正在创建一个简单的Java游戏,其中需要管理大量的Sprite,而其中一些Sprite具有相似的属性。当我检查碰撞等事件时,我需要获取所有扩展EnemySprite和将他们的坐标与玩家的精灵进行比较。)
由于在其他线程中完成了基准测试(参见/sf/answers/27833221/),因此可以看出Java 6中的instanceof实际上非常快.这是如何实现的?
我知道对于单继承,最快的想法是使用一些嵌套间隔编码,其中每个类维持[低,高]间隔,而instanceof只是间隔包含测试,即2个整数比较.但它是如何制作接口的(因为区间包含仅适用于单继承)?如何处理类加载?加载新的子类意味着必须调整很多间隔.
我们都同意使用instanceOf通常不是最好的解决方案.网上有很多例子.
但是让我们考虑一下以下示例,我们需要从一个片段调用一个方法到它的活动:
public class BaseActvity extends FragmentActivity implements ISomething {
@Override
public void doSomething();
}
Run Code Online (Sandbox Code Playgroud)
然后假设我们在应用程序中有一个需要调用的片段doSomething():
public MyFragment extends Fragment() {
public void onCreate() {
public void onResume() {
Activity activity = getActivity();
if (activity != null && activity instanceOf ISomething) {
ISomething something = (ISomething) activity;
something.doSomething();
}
}
}
public interface ISomething {
void doSomething();
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我们无法保证getActivity()将返回ISomething的对象,因此我们检查类型.一个改进是添加一个接口,但我们仍然要检查getActvity()返回类型以保护我们的代码.
由于Android Framework和getActivity()调用的性质,我找不到更好的解决方案.也许有人可以帮助一些输入..
注意:我添加了一个界面来跟随访问者模式.请注意,我仍然必须使用instanceOf来确保父活动正在实现它.
谢谢 .
Gaspar de Elais
我使用遗留库,需要使用cast Object to Collection.为避免异常,我认为使用instanceof.所以问题二:1.如果我使用instanceof - 需要使用try .. catch cast异常以避免异常?2.它是否达到了性能?谢谢.