小编Mar*_* A.的帖子

覆盖Java中的同步方法

假设我在某个类上有一个synchronized方法:

abstract class Foo {
    public synchronized void foo() {  // synchronized!
        // ...
    };
}
Run Code Online (Sandbox Code Playgroud)

并且我在使用synchronized修饰符的情况下覆盖它:

class Bar extends Foo {
    @Override
    public void foo() {               // NOT synchronized!
        super.foo();
        // ...
    }
 }
Run Code Online (Sandbox Code Playgroud)

关于这种情况,我有几个具体的问题:

  1. 被覆盖的方法也会被隐式同步吗?
  2. 如果没有,super-call会同步吗?
  3. 如果没有super-call,是否会同步?
  4. 有没有办法强制使用重写方法synchronized(我注意到接口内的抽象方法定义或方法定义不允许使用synchronized关键字)?

java overriding synchronized

45
推荐指数
2
解决办法
8624
查看次数

在Javascript中堆栈与堆?(超出最大调用堆栈大小)

我正在尝试构建一个网页,我需要在JavaScript中挖掘几个100MB的数据.对于不同的浏览器,我在不同的数据量下遇到"超出最大调用堆栈大小"错误.

我可以通过遍历我的代码并尝试将函数内部的局部变量移动到更全局的范围来尝试将它们分配到堆而不是堆栈来解决此问题吗?或者JavaScript中不存在这些概念?(据我所知,我的数据中没有任何主要的递归循环,所以它确实是一些巨大的字符串/数字数组似乎导致错误)

如果这不可能,有没有办法要求浏览器保留更多内存?

javascript heap stack memory-management

29
推荐指数
2
解决办法
1万
查看次数

有没有人让Google Play的"跟踪渠道(UTM)"广告系列跟踪工作?

谷歌Play开发者控制台提供了追踪频道(UTM)视图下,用户获取→性能应该能够显示故障,其中标记的链接用户点击才能到店上市,等等.

我使用Google Play网址构建器为我的应用生成了几个不同的链接,例如:

https://play.google.com/store/apps/details?id=com.vandenmars.colortrek&referrer=utm_source%3Dso%26utm_medium%3Dlink%26utm_campaign%3Dlink%26utm_content%3DTBk

上周我做了几个测试,我使用这些链接打开Play商店,然后立即从新设备上安装应用程序.但是,跟踪频道(UTM)列表仍然没有显示任何条目.

更多可能相关的背景:

  • 我的应用程序本身不使用Google AnalyticsSDK并且没有为INSTALL_REFERRER意图注册接收器
    我会假设Play商店直接处理链接而不需要应用程序交互,特别是因为它可以跟踪不会导致的商店列表视图安装,但也许这是不正确的?或者商店可能会根据应用清单禁用跟踪?
  • 我在我的电脑上打开了Chrome中的链接,然后单击"安装",
    如果在实际设备上的Play商店应用中打开链接,可能只会跟踪链接?看起来很奇怪,但我现在正在进行测试,数据尚未更新.
  • 我所做的标记安装是在已经处理过的日子里
    .有时需要Google更新"性能"数据,但我能看到的数据已包含在本周日,测试在周五完成.因此,除非UTM跟踪数据需要更长时间才能得到处理,否则它应该已经显示出来.

我需要在某个地方启用某些功能吗?或者我做错了什么?

更新1:

同时,一个条目已经开始出现在跟踪频道(UTM)列表中.不幸的是,正如帮助文本所述,"具有单个商店列表访问者[...]的UTM标记链接包含在"其他"类别中." 所以我不知道我的测试链接是哪个,如果有的话.该条目仅显示为商品列表访问者,但不显示为安装程序.

统计数据中包含的最后一天是星期三(据说),这也是我第一次在设备上的Play商店应用中直接打开链接的测试的那一天.我确实在访问期间安装了应用程序,但是在我卸载以前的安装之后.

所以,这是我从中学到的东西:

  • 它看起来不像我需要启用UTM标记的一些开/关开关.
  • 仅仅跟踪商店列表访问者并不严格需要包括Analytics SDK和注册INSTALL_REFERRER ,但可能需要跟踪安装人员/购买者.
  • 可能是参观从一个设备上的Play商店应用与PC链接标记之间的差异.

这留下了以下问题:

  • UTM链接仅由Play商店应用跟踪,还是访问http://play.google.com/ ...?
  • 应用是否需要使用Analytics SDK将有关安装和购买的信息转发到Play商店,或者是否像商店列表访问者一样独立于应用进行跟踪?
  • 正在计算特定设备上的应用程序只有在第一次安装安装程序,或全新安装后卸载也算?工厂重置设备后怎么样?
  • 奖金问题:有没有办法扩展"其他"类别?:)

更新2:

现在我回到原点:3天前,我在不同的设备上打开了更多的测试链接(包括我认为是上次出现的那个),直接在应用程序商店中,立即安装应用程序.显示的数据包括两天前的所有内容,因此应立即跟踪这些访问和安装.但是,该列表未显示除上述更新1之外的任何其他条目.

所以,要么我完全不知道应该发生什么,要么这整个跟踪系统是一个巨大的马车混乱...我在随机论坛中读到的一些事情暗示后者,但也许我也错过了什么?

更新3:

这变得越来越陌生和陌生.现在,突然间,我看到一个显示14个商店访问和10个"zedge/android"安装的条目!为什么有人会为我的应用制作自己的标记链接?!?最重要的是,我的其他测试都没有显示出来(仍然只是"其他"下的原始条目)我甚至没有看到统计中的10个安装...看起来整个事情只是简单的破碎...更正欢迎.

android google-play utm-tracking

26
推荐指数
1
解决办法
7114
查看次数

在java变量参数列表中至少需要一个元素

在此代码构造中:

public MyClass(Integer... numbers) {
    do_something_with(numbers[]);
}
Run Code Online (Sandbox Code Playgroud)

是否可以要求numbers以这种方式包含至少一个条目,以便在编译时检查?(在运行时,当然,我可以检查numbers.length.)

显然,我可以做到这一点:

public MyClass(Integer number, Integer... more_numbers) {
    do_something_with(number, more_numbers[]);
}
Run Code Online (Sandbox Code Playgroud)

但这不会很优雅.

我想这样做的原因是为了确保子类不会完全忘记调用这个构造函数,这将默认为super()在列表中没有数字的调用.在这种情况下,我宁愿得到熟悉的错误信息:Implicit super constructor is undefined. Must explicitly invoke another constructor.

是否有另一种方法可以实现相同的效果,例如@ -annotation将此构造函数标记为非隐式?

java arguments minimum variadic-functions

24
推荐指数
3
解决办法
9326
查看次数

通过未经检查的类型转换在Java中创建通用数组

如果我有一个泛型类Foo<Bar>,我不允许创建一个数组,如下所示:

Bar[] bars = new Bar[];
Run Code Online (Sandbox Code Playgroud)

(这将导致错误"无法创建Bar的通用数组").

但是,正如dimo414在回答这个问题(Java如何:通用数组创建)中所建议的那样,我可以做到以下几点:

Bar[] bars = (Bar[]) new Object[];
Run Code Online (Sandbox Code Playgroud)

(这将"仅"生成警告:"类型安全:从Object []到Bar []"的未选中的强制转换.

在回应dimo414的回答的评论中,有些人声称使用这种结构可能会在某些情况下引起问题而其他人说它很好,因为对数组的唯一引用是bars,它已经是所需的类型.

我有点困惑,在哪些情况下这是可以的,在哪些情况下,它可以让我陷入困境.例如,newacctAaron McDaid的评论似乎直接相互矛盾.不幸的是,原始问题中的评论流只是以未解答的"为什么这个'不再正确'?"结束,所以我决定为它提出一个新问题:

如果bars-array只包含类型的条目Bar,那么在使用数组或其条目时是否仍然存在任何运行时问题?或者是唯一的危险,在运行时我可以在技术上将数组转换为其他东西(比如String[]),然后允许我用其他类型的值填充它Bar

我知道我可以使用Array.newInstance(...),但我对上面的类型转换构造特别感兴趣,因为,例如,在GWT中,newInstance(...)-option不可用.

java arrays generics casting type-safety

18
推荐指数
1
解决办法
1万
查看次数

NullPointerException通过Java三元运算符的自动装箱行为

NullPointerException几天我在三元运算符中意外地进行了类型转换,这让我感到非常奇怪.鉴于此(无用的示例)功能:

Integer getNumber() {
    return null;
}
Run Code Online (Sandbox Code Playgroud)

我希望编译后以下两个代码段完全相同:

Integer number;
if (condition) {
    number = getNumber();
} else {
    number = 0;
}
Run Code Online (Sandbox Code Playgroud)

Integer number = (condition) ? getNumber() : 0;
Run Code Online (Sandbox Code Playgroud)

.

事实证明,如果conditiontrue,if-statement工作正常,而第二个代码段中的三元操作抛出一个NullPointerException.似乎三元操作决定int在将结果自动装箱之前将两种选择都输入到一个Integer!?!事实上,如果我明确地转换0Integer,则异常消失.换一种说法:

Integer number = (condition) ? getNumber() : 0;
Run Code Online (Sandbox Code Playgroud)

是不一样的:

Integer number = (condition) ? getNumber() : (Integer) 0;
Run Code Online (Sandbox Code Playgroud)

.

因此,似乎三元运算符和等效if-else语句之间存在字节码差异(我没想到的事情).这提出了三个问题:为什么会有差异?这是三元实现中的错误还是有类型转换的原因?鉴于存在差异,三元运算的性能是否与等效的if陈述相比或多或少(我知道,差异不是很大,但仍然存在)?

java autoboxing nullpointerexception ternary

15
推荐指数
2
解决办法
1896
查看次数

将"外部工具配置"从一个Eclipse安装转移到另一个Eclipse的快速方法?

有没有快速的方法将"外部工具配置"从一个Eclipse安装转移到另一个?

它似乎没有提供导入/导出设置......

eclipse configuration export external

14
推荐指数
3
解决办法
8459
查看次数

Java常量表达式和代码消除

随着讨论这里,javac的和其他Java编译器可以提供代码消除能力if-statements这里的条件是"常量表达式".

如果我的代码使用依赖于不同包中定义的其他常量表达式的常量表达式,这会受到什么影响?

例如,假设我在相应的指定包中有以下类:

package foo;

public class Foo {
    public static final boolean CONDITION = false;
}
Run Code Online (Sandbox Code Playgroud)

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.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,如果foo-package是在从外部JAR文件运行时加载,编译器不能在技术上只是假设,Foo.CONDITION将是错误的,不应该消除true的分枝的if语句来.

然而,如果Foo并且Bar实际上在同一个包中,则true应该绝对消除-branch(如果编译器完全支持代码消除).

不太确定如何最好短语这个问题,但:如何"亲密"也Foo必须是Bar常量表达式在 …

java compiler-construction dead-code constant-expression code-elimination

12
推荐指数
1
解决办法
396
查看次数

避免泛型类型的表格Foo <ActualType扩展了Foo <ActualType >>

我经常发现自己想要编写表单的泛型类定义

public class Foo<ActualType extends Foo<ActualType>>
Run Code Online (Sandbox Code Playgroud)

例如,在这样的设置中:

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>() { …
Run Code Online (Sandbox Code Playgroud)

java generics

11
推荐指数
1
解决办法
406
查看次数

缺少Class.isInstance()的GWT解决方法

我正在尝试在GWT中编写一个作业调度系统,它维护一系列例外(Class<? extends Exception>[] exceptions),可以通过重试作业来解决.为此,如果调度程序捕获异常,我需要查看此异常是否与数组中的某个类匹配.所以,我希望有这样的功能:

boolean offerRetry(Exception exception) {
    for (Class<? extends Exception> e: exceptions)
        if (e.isInstance(exception)) return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

不幸的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;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法不支持对接口进行测试,我也不知道如何解决这个问题,因为Class.getInterfaces()它也是不可用的.但是这种方法Class.isInstance在所有其他情况下至少与Java的工作方式相同,不包括接口吗?具体来说,如果我查看GWT的Class.java源代码,该getSuperclass()方法包含一个检查isClassMetadataEnabled(),可能会返回false(但我不知道在哪些情况下),因为它包含一条评论说"这个主体可能被替换为编译器".

还是有更好的方法来做到这一点?

java gwt class instanceof

9
推荐指数
2
解决办法
1918
查看次数