假设我在某个类上有一个synchronized方法:
abstract class Foo {
    public synchronized void foo() {  // synchronized!
        // ...
    };
}
并且我在不使用synchronized修饰符的情况下覆盖它:
class Bar extends Foo {
    @Override
    public void foo() {               // NOT synchronized!
        super.foo();
        // ...
    }
 }
关于这种情况,我有几个具体的问题:
super-call会同步吗?super-call,是否会同步?synchronized(我注意到接口内的抽象方法定义或方法定义不允许使用synchronized关键字)?我正在尝试构建一个网页,我需要在JavaScript中挖掘几个100MB的数据.对于不同的浏览器,我在不同的数据量下遇到"超出最大调用堆栈大小"错误.
我可以通过遍历我的代码并尝试将函数内部的局部变量移动到更全局的范围来尝试将它们分配到堆而不是堆栈来解决此问题吗?或者JavaScript中不存在这些概念?(据我所知,我的数据中没有任何主要的递归循环,所以它确实是一些巨大的字符串/数字数组似乎导致错误)
如果这不可能,有没有办法要求浏览器保留更多内存?
在谷歌Play开发者控制台提供了追踪频道(UTM)视图下,用户获取→性能应该能够显示故障,其中标记的链接用户点击才能到店上市,等等.
我使用Google Play网址构建器为我的应用生成了几个不同的链接,例如:
上周我做了几个测试,我使用这些链接打开Play商店,然后立即从新设备上安装应用程序.但是,跟踪频道(UTM)列表仍然没有显示任何条目.
更多可能相关的背景:
我需要在某个地方启用某些功能吗?或者我做错了什么?
更新1:
同时,一个条目已经开始出现在跟踪频道(UTM)列表中.不幸的是,正如帮助文本所述,"具有单个商店列表访问者[...]的UTM标记链接包含在"其他"类别中." 所以我不知道我的测试链接是哪个,如果有的话.该条目仅显示为商品列表访问者,但不显示为安装程序.
统计数据中包含的最后一天是星期三(据说),这也是我第一次在设备上的Play商店应用中直接打开链接的测试的那一天.我确实在访问期间安装了应用程序,但是在我卸载以前的安装之后.
所以,这是我从中学到的东西:
这留下了以下问题:
更新2:
现在我回到原点:3天前,我在不同的设备上打开了更多的测试链接(包括我认为是上次出现的那个),直接在应用程序商店中,立即安装应用程序.显示的数据包括两天前的所有内容,因此应立即跟踪这些访问和安装.但是,该列表未显示除上述更新1之外的任何其他条目.
所以,要么我完全不知道应该发生什么,要么这整个跟踪系统是一个巨大的马车混乱...我在随机论坛中读到的一些事情暗示后者,但也许我也错过了什么?
更新3:
这变得越来越陌生和陌生.现在,突然间,我看到一个显示14个商店访问和10个"zedge/android"安装的条目!为什么有人会为我的应用制作自己的标记链接?!?最重要的是,我的其他测试都没有显示出来(仍然只是"其他"下的原始条目)我甚至没有看到统计中的10个安装...看起来整个事情只是简单的破碎...更正欢迎.
在此代码构造中:
public MyClass(Integer... numbers) {
    do_something_with(numbers[]);
}
是否可以要求numbers以这种方式包含至少一个条目,以便在编译时检查?(在运行时,当然,我可以检查numbers.length.)
显然,我可以做到这一点:
public MyClass(Integer number, Integer... more_numbers) {
    do_something_with(number, more_numbers[]);
}
但这不会很优雅.
我想这样做的原因是为了确保子类不会完全忘记调用这个构造函数,这将默认为super()在列表中没有数字的调用.在这种情况下,我宁愿得到熟悉的错误信息:Implicit super constructor is undefined. Must explicitly invoke another constructor.
是否有另一种方法可以实现相同的效果,例如@ -annotation将此构造函数标记为非隐式?
如果我有一个泛型类Foo<Bar>,我不允许创建一个数组,如下所示:
Bar[] bars = new Bar[];
(这将导致错误"无法创建Bar的通用数组").
但是,正如dimo414在回答这个问题(Java如何:通用数组创建)中所建议的那样,我可以做到以下几点:
Bar[] bars = (Bar[]) new Object[];
(这将"仅"生成警告:"类型安全:从Object []到Bar []"的未选中的强制转换.
在回应dimo414的回答的评论中,有些人声称使用这种结构可能会在某些情况下引起问题而其他人说它很好,因为对数组的唯一引用是bars,它已经是所需的类型.
我有点困惑,在哪些情况下这是可以的,在哪些情况下,它可以让我陷入困境.例如,newacct和Aaron McDaid的评论似乎直接相互矛盾.不幸的是,原始问题中的评论流只是以未解答的"为什么这个'不再正确'?"结束,所以我决定为它提出一个新问题:
如果bars-array只包含类型的条目Bar,那么在使用数组或其条目时是否仍然存在任何运行时问题?或者是唯一的危险,在运行时我可以在技术上将数组转换为其他东西(比如String[]),然后允许我用其他类型的值填充它Bar?
我知道我可以使用Array.newInstance(...),但我对上面的类型转换构造特别感兴趣,因为,例如,在GWT中,newInstance(...)-option不可用.
前NullPointerException几天我在三元运算符中意外地进行了类型转换,这让我感到非常奇怪.鉴于此(无用的示例)功能:
Integer getNumber() {
    return null;
}
我希望编译后以下两个代码段完全相同:
Integer number;
if (condition) {
    number = getNumber();
} else {
    number = 0;
}
与
Integer number = (condition) ? getNumber() : 0;
.
事实证明,如果condition是true,if-statement工作正常,而第二个代码段中的三元操作抛出一个NullPointerException.似乎三元操作决定int在将结果自动装箱之前将两种选择都输入到一个Integer!?!事实上,如果我明确地转换0为Integer,则异常消失.换一种说法:
Integer number = (condition) ? getNumber() : 0;
是不一样的:
Integer number = (condition) ? getNumber() : (Integer) 0;
.
因此,似乎三元运算符和等效if-else语句之间存在字节码差异(我没想到的事情).这提出了三个问题:为什么会有差异?这是三元实现中的错误还是有类型转换的原因?鉴于存在差异,三元运算的性能是否与等效的if陈述相比或多或少(我知道,差异不是很大,但仍然存在)?
有没有快速的方法将"外部工具配置"从一个Eclipse安装转移到另一个?
它似乎没有提供导入/导出设置......
随着讨论这里,javac的和其他Java编译器可以提供代码消除能力if-statements这里的条件是"常量表达式".
如果我的代码使用依赖于不同包中定义的其他常量表达式的常量表达式,这会受到什么影响?
例如,假设我在相应的指定包中有以下类:
package foo;
public class Foo {
    public static final boolean CONDITION = false;
}
和
package bar;
import foo.Foo;
public class Bar {
    public void test() {
        if (Foo.CONDITION) {
            System.out.println("This line of code could be eliminated.");
        } else {
            System.out.println("This line of code will be executed.");
        }
    }
}
显然,如果foo-package是在从外部JAR文件运行时加载,编译器不能在技术上只是假设,Foo.CONDITION将是错误的,不应该消除true的分枝的if语句来.
然而,如果Foo并且Bar实际上在同一个包中,则true应该绝对消除-branch(如果编译器完全支持代码消除).
不太确定如何最好短语这个问题,但:如何"亲密"也Foo必须是Bar常量表达式在 …
java compiler-construction dead-code constant-expression code-elimination
我经常发现自己想要编写表单的泛型类定义
public class Foo<ActualType extends Foo<ActualType>>
例如,在这样的设置中:
public interface ChangeHandler<SourceType> {
    public void onChange(SourceType source);
}
public class Foo<ActualType extends Foo<ActualType>> {
    private final List<ChangeHandler<ActualType>> handlers = new ArrayList<>();
    public void addChangeHandler(ChangeHandler<ActualType> handler) {
        handlers.add(handler);
    }
    @SuppressWarnings("unchecked")
    protected void reportChange() {
        for (ChangeHandler<ActualType> handler: handlers)
            handler.onChange((ActualType) this);
    }
}
public class Bar extends Foo<Bar> {
    // things happen in here that call super.reportChange();
}
public static void main(String[] args) throws IOException {
    Bar bar = new Bar();
    bar.addChangeHandler(new ChangeHandler<Bar>() { …我正在尝试在GWT中编写一个作业调度系统,它维护一系列例外(Class<? extends Exception>[] exceptions),可以通过重试作业来解决.为此,如果调度程序捕获异常,我需要查看此异常是否与数组中的某个类匹配.所以,我希望有这样的功能:
boolean offerRetry(Exception exception) {
    for (Class<? extends Exception> e: exceptions)
        if (e.isInstance(exception)) return true;
    return false;
}
不幸的Class.isInstance(...)是GWT没有.
有一个很好的解决方案吗?我目前最好的猜测是这样的:
public static boolean isInstance(Class<?> clazz, Object o) {
    if ((clazz==null) || (o==null)) return false;
    if (clazz.isInterface()) throw new UnsupportedOperationException();
    Class<?> oClazz = o.getClass();
    while (oClazz!=null) {
        if (oClazz.equals(clazz)) return true;
        oClazz = oClazz.getSuperclass();
    }
    return false;
}
不幸的是,这种方法不支持对接口进行测试,我也不知道如何解决这个问题,因为Class.getInterfaces()它也是不可用的.但是这种方法Class.isInstance在所有其他情况下至少与Java的工作方式相同,不包括接口吗?具体来说,如果我查看GWT的Class.java源代码,该getSuperclass()方法包含一个检查isClassMetadataEnabled(),可能会返回false(但我不知道在哪些情况下),因为它包含一条评论说"这个主体可能被替换为编译器".
还是有更好的方法来做到这一点?
java ×7
generics ×2
android ×1
arguments ×1
arrays ×1
autoboxing ×1
casting ×1
class ×1
dead-code ×1
eclipse ×1
export ×1
external ×1
google-play ×1
gwt ×1
heap ×1
instanceof ×1
javascript ×1
minimum ×1
overriding ×1
stack ×1
synchronized ×1
ternary ×1
type-safety ×1
utm-tracking ×1