从我读过,您可以通过onClick两种方式为按钮分配处理程序.
使用android:onClickXML属性,您只需使用带有签名的公共方法的名称,void name(View v)或使用setOnClickListener传递实现OnClickListener接口的对象的方法.后者通常需要一个我个人不喜欢的匿名课程(个人品味)或者定义实现该课程的内部课程OnClickListener.
通过使用XML属性,您只需要定义一个方法而不是一个类,所以我想知道是否可以通过代码而不是XML布局来完成相同的操作.
具有一系列"instanceof"操作被认为是"代码味道".标准答案是"使用多态".在这种情况下我该怎么做?
基类有许多子类; 没有一个在我的控制之下.类似的情况是Java类Integer,Double,BigDecimal等.
if (obj instanceof Integer) {NumberStuff.handle((Integer)obj);}
else if (obj instanceof BigDecimal) {BigDecimalStuff.handle((BigDecimal)obj);}
else if (obj instanceof Double) {DoubleStuff.handle((Double)obj);}
Run Code Online (Sandbox Code Playgroud)
我确实可以控制NumberStuff等等.
我不想在几行代码中使用多行代码.(有时我将一个HashMap映射到一个IntegerStuff的实例,将BigDecimal.class映射到一个BigDecimalStuff的实例等等.但是今天我想要一些更简单的东西.)
我想要像这样简单的东西:
public static handle(Integer num) { ... }
public static handle(BigDecimal num) { ... }
Run Code Online (Sandbox Code Playgroud)
但是Java不会那样工作.
我想在格式化时使用静态方法.我正在格式化的东西是复合的,其中Thing1可以包含一个数组Thing2s和Thing2可以包含一个Thing1s数组.当我实现这样的格式化程序时,我遇到了问题:
class Thing1Formatter {
private static Thing2Formatter thing2Formatter = new Thing2Formatter();
public format(Thing thing) {
thing2Formatter.format(thing.innerThing2);
}
}
class Thing2Formatter {
private static Thing1Formatter thing1Formatter = new Thing1Formatter();
public format(Thing2 thing) {
thing1Formatter.format(thing.innerThing1);
}
}
Run Code Online (Sandbox Code Playgroud)
是的,我知道HashMap和更多代码也可以修复它.但相比之下,"instanceof"似乎更具可读性和可维护性.有什么简单但不臭吗?
注释已添加5/10/2010:
事实证明,将来可能会添加新的子类,而我现有的代码必须优雅地处理它们.在这种情况下,类上的HashMap不起作用,因为找不到类.一系列if语句,从最具体的开始到以最一般的结尾,可能是最好的:
if (obj instanceof SubClass1) …Run Code Online (Sandbox Code Playgroud) java reflection polymorphism instanceof chain-of-responsibility
是否有关于如何重写特定规则equals()与hashCode()在子类考虑超领域?知道有很多参数:超级字段是私有/公共的,有/无getter ...
例如,Netbeans生成的equals()&hashCode()将不考虑超级字段...和
new HomoSapiens("M", "80", "1.80", "Cammeron", "VeryHot").equals(
new HomoSapiens("F", "50", "1.50", "Cammeron", "VeryHot"))
Run Code Online (Sandbox Code Playgroud)
将返回true :(
public class Hominidae {
public String gender;
public String weight;
public String height;
public Hominidae(String gender, String weight, String height) {
this.gender = gender;
this.weight = weight;
this.height = height;
}
...
}
public class HomoSapiens extends Hominidae {
public String name;
public String faceBookNickname;
public HomoSapiens(String gender, String weight, String height,
String name, String …Run Code Online (Sandbox Code Playgroud) 基于其缓慢的声誉,我总是避免使用Java反射.我在当前项目的设计中达到了一个重点,能够使用它会使我的代码更具可读性和优雅性,所以我决定试一试.
我对这种差异感到惊讶,有时候我注意到运行时间差了近100倍.即使在这个简单的例子中它只是实例化一个空类,它也令人难以置信.
class B {
}
public class Test {
public static long timeDiff(long old) {
return System.currentTimeMillis() - old;
}
public static void main(String args[]) throws Exception {
long numTrials = (long) Math.pow(10, 7);
long millis;
millis = System.currentTimeMillis();
for (int i=0; i<numTrials; i++) {
new B();
}
System.out.println("Normal instaniation took: "
+ timeDiff(millis) + "ms");
millis = System.currentTimeMillis();
Class<B> c = B.class;
for (int i=0; i<numTrials; i++) {
c.newInstance();
}
System.out.println("Reflecting instantiation took:"
+ timeDiff(millis) + "ms");
} …Run Code Online (Sandbox Code Playgroud) 我无法理解源代码Arrays.copyOf.
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
Run Code Online (Sandbox Code Playgroud)
这行检查是什么?
(Object)newType == (Object)Object[].class
Run Code Online (Sandbox Code Playgroud)(T[]) new Object[newLength]和之间有什么区别(T[]) Array.newInstance(newType.getComponentType(), newLength)?为什么Array.newInstance两种情况都不够好?
以下行编译,但在运行时崩溃(如预期的那样).我什么时候应该使用这种方法?
Integer[] nums = Arrays.copyOf(new String[]{"a", "b"}, 2, Integer[].class)
Run Code Online (Sandbox Code Playgroud)我想知道是否有任何额外的优化我可以实现以提高Java中反射调用的速度.并不是说性能是令人望而却步的,但是我在考虑库中的某些代码时得到了一些我正在编写的代码在某个地方以紧密的方式实现.
考虑一种反射性调用的实用方法:
public static Object invoke(Object targetObject, String methodName, Object[] arguments, Class<?>[] signature)
Run Code Online (Sandbox Code Playgroud)
基本操作是
return method.invoke(targetObject, arguments);
Run Code Online (Sandbox Code Playgroud)
作为性能优化,我使用目标对象的类,方法名称和签名(其代码可能使用某些改进)的哈希来缓存方法,但除此之外,还有什么我可以做的吗?我听说过InvokeDynamic的一些早期实现的参考听起来很有希望,但我只是假设它们可能还不适用,并且我打算使用自己的字节代码操作,因为我希望保持实用程序简单(但速度快).
干杯.
所以我知道之前已经完成了这个主题,例如Java Reflection Performance,但我的特殊问题是,似乎很多流行的库都是通过注释和反射来实现的(例如Gson,Jackson,Jaxb实现,hibernate搜索).许多(如果不是全部)库提供良好(或很好)的性能,即使它们使用反射.我的问题是,他们是如何做到的?是否有一些"技巧"要知道或者他们只是使用直接反射,而表演的担忧是夸大其词?
编辑:例如,当我们写:MyObject obj = new Gson().fromJson(someInputStream,MyObject.class);
我可以理解库如何在内部缓存Field对象,但在我看来,它需要每次都反射性地实例化对象,并且它需要根据json的解析值调用每个字段上的setter(反射) .或者有没有办法只在启动时支付(全部)反射成本?
我肯定注意到Gson/Jackson等具有相对较大的启动成本,之后非常快.所以很明显我想知道,如果我写一个模糊相似的图书馆,我需要了解一些技巧吗?因为看起来你无法在每次通话时远离一些反射.
是否设置和使用反射(得到一个对象的属性java.lang.reflect.Field get和set功能),而不是调用set和get对象本身,导致任何显著的性能差异?
我正在开发一个Android项目,我有很多可绘制的东西.这些绘图资源都命名为喜欢的icon_0.png,icon_1.png... icon_100.png.我想将这些drawable的所有资源id添加到Integers的ArrayList中.(对于那些不了解android的人,只有Java,我在谈论静态变量,在类的静态内部类中,就像R.drawable.icon_0.所有这些静态变量都是整数.)
有没有更有效的方法来做到这一点,而不是逐个添加它们?喜欢
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(R.drawable.icon_1);
list.add(R.drawable.icon_2);
...
list.add(R.drawable.icon_100);
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式循环它们吗?喜欢
for(int i=0; i<100; i++)
{
list.add(R.drawable.icon_+i); //<--- I know this doesn't work.
}
Run Code Online (Sandbox Code Playgroud)
我无法控制这些静态整数所在的文件,并且我无法在运行时创建drawable.
任何帮助,将不胜感激!
编辑
好吧,我读了答案,但我有一个主要问题:我无法访问任何Context需要创建此数组/ id列表的实例(我在静态初始化块中执行),因此getResources()方法,建议的两个答案不会起作用.有没有其他方法这样做?
java ×9
reflection ×5
android ×2
performance ×2
arrays ×1
equals ×1
generics ×1
hashcode ×1
inheritance ×1
instanceof ×1
onclick ×1
overriding ×1
polymorphism ×1
stack-trace ×1