如果我杀了一个Android应用程序System.exit(...),我传递的状态代码是否重要?我找不到任何关于Android是否会忽略它的文档,或者某些文档是否会导致任何错误消息或具有任何其他含义.
是否有维持在需要传递一些扩展类(比使它从超类访问,或将其传递到构造函数中的参数等)的超级构造函数构造函数创建的对象的引用的好办法?
让我用一个例子来澄清.拿这个类(我无法修改,哪些不能让我访问foo):
class TestA {
TestA(Object foo) {}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想扩展这个类如下:
class TestB extends TestA {
Object myCopyOfFoo;
TestB() {
super(new Object());
}
}
Run Code Online (Sandbox Code Playgroud)
有没有一种很好的方法来存储创建new Object()的myCopyOfFoo?
这三个想法中的任何一个都不起作用:
TestB() {
myCopyOfFoo = new Object();
super(myCopyOfFoo);
}
Run Code Online (Sandbox Code Playgroud)
(错误:构造函数调用必须是构造函数中的第一个语句)
TestB() {
super(myCopyOfFoo = new Object());
}
Run Code Online (Sandbox Code Playgroud)
(错误:显式调用构造函数时无法引用实例字段myCopyOfFoo)
TestB() {
super(makeFoo());
}
Object makeFoo() {
myCopyOfFoo = new Object();
return myCopyOfFoo;
}
Run Code Online (Sandbox Code Playgroud)
(错误:显式调用构造函数时无法引用实例方法)
我想我可以做到以下几点,但它既不是线程安全也不优雅:
static Object tempFoo;
TestB() {
super(tempFoo = new Object());
myCopyOfFoo = tempFoo;
}
Run Code Online (Sandbox Code Playgroud)
有没有人对我有更好的想法?为什么我的前两个想法不合法呢?
我甚至不知道给这个题什么题,这太奇怪了.我构建了一个小的Android逻辑谜题,它使用ARGB整数格式的颜色值.要在完成关卡时混合动画的颜色,我有以下功能:
public static int blend(int color1, int color2, double position) {
if (position<0) position=0;
if (position>1) position=1;
int a = (color1 >>> 24) & 0xFF;
int r = (color1 >>> 16) & 0xFF;
int g = (color1 >>> 8) & 0xFF;
int b = color1 & 0xFF;
int da = ((color2 >>> 24) & 0xFF) - a;
int dr = ((color2 >>> 16) & 0xFF) - r;
int dg = ((color2 >>> 8) & 0xFF) - g;
int …Run Code Online (Sandbox Code Playgroud) 我很难找到有关javac代码消除功能的信息:
我读到如果你有类似下面这样的东西,那么if-statement将被淘汰:
static final boolean DEBUG = false;
if (DEBUG) System.out.println("Hello World!"); // will be removed
Run Code Online (Sandbox Code Playgroud)
但是这个怎么样,例如:
static final int VALUE = 3;
if (VALUE > 9) System.out.println("VALUE > 9 ???"); // will this be removed?
Run Code Online (Sandbox Code Playgroud)
或这个:
static final SomeEnum VALUE = SomeEnum.FOO;
if (VALUE==SomeEnum.BAR) System.out.println("Bar???"); // will this be removed?
Run Code Online (Sandbox Code Playgroud)
由于分析程序以查找所有死代码(可能类似于暂停问题)非常困难/不可能,因此我认为只有少数明确定义的构造(如上面的第一个示例),javac它将识别并删除可靠.是否有这些结构的完整列表?
通过Billing API的第3版,Google消除了消费品和非消费品之间的区别.两者都被组合成一种名为"托管"的新类型,其行为有点像混合:您的应用需要主动调用方法来"消耗"这些项目.如果从未对一组skus执行此操作,那些项目基本上就像它们是非消耗品一样.
该文档描述了预期的购买流程,如下所示:
getBuyIntent电话启动购买流程.Bundle从Google Play 获取回复,表明购买是否成功完成.consumePurchase请拨打电话进行购买.我看到这种方法存在两个问题.一个是相当明显的,文档中的"bug"比API更多,但另一个是相当微妙的,我仍然没有想出如何最好地处理它.让我们从显而易见的完整性开始:
问题1:在单个设备上购买丢失:
文档说,应用程序应在getPurchases每次启动时调用"检查用户是否拥有任何未完成的耗材应用程序内产品".如果是这样,应用程序应使用这些并配置关联的项目.这包括购买流程在购买完成后但在消耗物品之前(即步骤2周围)中断的情况.
但是如果购买流程在步骤4和5之间中断怎么办?即应用程序已经成功完成了购买,但它有机会将产品配置给用户之前已经被杀死(电话进来并且没有足够的内存,电池耗尽,崩溃等等).在这种情况下,购买将不再包括在内getPurchases,基本上用户永远不会收到他所支付的费用(在这里插入愤怒的支持电子邮件和一星评价) ......
幸运的是,通过引入"日志"(如在文件系统中)将购买流程更改为更类似的内容(步骤1和2与上面相同),这个问题相当容易解决:
如果购买成功,请进入日记中说"一旦购买<order-id here>成功消费,就将硬币从300增加到400 ".
确认日记帐后,通过consumePurchase拨打电话进行购买.
然后,每次应用程序启动时,它不应该只检查getPurchases,而且还应该是日志.如果有未完成购买的条目未报告getPurchases,请继续执行步骤6.如果稍后getPurchase再将该订单ID再次归还(例如,如果消费完全失败),则只需忽略该交易journal将此订单ID列为完整.
这应该解决问题1,但如果您发现此方法存在任何缺陷,请告诉我.
问题2:涉及多个设备时的问题:
假设用户拥有两台设备(例如手机和平板电脑),两者都拥有相同的帐户.
他(或她 - 从现在开始暗示)可以尝试在他的手机上购买更多硬币,并且应用程序可能会在购买完成后被杀死,但在消费之前.现在,如果他接下来在平板电脑上打开应用程序,getPurchases则会将产品报告为已拥有.
平板电脑上的应用程序必须假定购买是在那里启动的,并且在创建日记帐分录之前就已经死亡,因此它将创建日记帐分录,使用产品并配置硬币.
如果手机应用程序在有机会进入日记帐之前就已经死亡,那么硬币将永远不会在手机上配置(在这里插入愤怒的支持电子邮件和一星评价).如果手机应用程序在创建日记帐分录后死亡,则硬币也将在手机上配置,基本上可以让用户在平板电脑上免费购买(在此处插入损失的收入).
解决此问题的一种方法是在购买时添加一些唯一的安装或设备ID作为有效负载,以检查购买是否适用于此设备.然后,平板电脑可以简单地忽略购买,只有手机才会记入硬币并消费该物品.
但是: …
我想出了HttpServletResponse在开始将响应体写入输出缓冲区之后不可能添加更多标头的困难方式,我想在一些随机的宇宙中可能有意义,即使所有内容仍然只是缓冲在内存中.
现在的问题是:是否有一些技巧可以以某种方式绕过这个?显然,由于该功能resetBuffer()可用,允许在不清除标题的情况下清除内容主体,因此必须有某种方式使HttpServletResponse对象返回到可以编写更多标题的状态.例如,是否有一种方法来读取内容正文,清除它resetBuffer(),设置更多标题,然后恢复内容正文?
旁白:我想这样做的原因是我可以添加一个标题作为我的servlet的最后一步,它告诉我服务器忙于处理请求多长时间.
我有一个我需要在我的一个项目中使用的库,不幸的是它注册了自己URLStreamHandler来处理http- URLs.有没有办法获得对Java的默认http-和https-的引用URLStreamHandlers,所以我可以在URL构造函数中指定其中一个来打开标准的http连接而不使用库覆盖的协议?
我在查询游标的AppEngine文档中遇到了以下段落:
游标的一个有趣应用是监视实体的看不见的变化.如果应用程序在每次实体更改时使用当前日期和时间设置时间戳属性,则应用程序可以使用按时间戳属性(按升序排序)的查询,并使用数据存储区光标检查实体何时移动到结果列表的末尾.如果更新了实体的时间戳,则使用游标的查询将返回更新的实体.如果自上次执行查询后未更新任何实体,则不返回任何结果,并且光标不会移动.
为了使其可靠地工作,必须对不同服务器实例之间的时钟同步提供某种保证.否则你可能会遇到以下情况:
据我所知,从来没有任何这样的时钟同步保证.这改变了???
更新:
我刚刚意识到,即使时钟完全同步,这种方法也可能因为查询的最终一致性而错过结果.如果稍后的更新最终在早期更新之前提交并使其成为同时查询而前一个更新没有,则它将隐藏先前的更新.或者我错过了什么?
是否有正确的 JavaDoc 语法{@link Foo.class}?既不是这个,也不是{@link Foo#class}工作。或者这是不可能的?
让我扩展一点:
我有一个registerException(Class<? extends Exception> exceptionClass)被调用的函数,例如registerException(IOException.class)并开始为它编写以下 JavaDoc:
/**
* Registers a new {@link Class Class<? extends Exception>}
* (e.g. <code>IOException.class</code>} that can be flattened by this handler.
*
* @param exceptionClass - the exception class
*/
Run Code Online (Sandbox Code Playgroud)
我在想我是否可以在{@link ...}周围放置一个IOException.class.
是否有可能以某种方式将enumJava中的某些值标记为package-private,即为它们提供默认修饰符?
背景(只是为了抢占其他立即的第一条评论"为什么?";))
我有一个Task具有不同执行方法的对象和一个执行状态,它决定下一个要调用的方法.每个执行方法返回下一个要调用的方法的执行状态(基本上是执行状态机的框架).
我有一个enum包含所有可能的执行状态,但也包含一些"包内部"状态,如"挂起"或"失败",执行方法不应该返回.
我知道我可以使用自己的枚举在一个单独的变量中管理这些状态,但这会使代码变得不那么干净,因为它将单个switch语句转换为(至少)两个(并且可能是周围的if).此外,我当然可以只检查返回值,但我甚至不想在第一时间提供错误的值.
java ×7
android ×3
constructor ×1
dead-code ×1
enums ×1
exit-code ×1
field ×1
google-play ×1
http-headers ×1
instance ×1
javac ×1
javadoc ×1
servlets ×1
super ×1
system-clock ×1
system.exit ×1
visibility ×1