我的同事建议将几个Eclipse代码格式和警告设置更严格.这些变化中的大多数都是有意义的,但我在Java中得到了一个奇怪的警告.这里有一些重现"问题"的测试代码:
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass
{
public void doSomething() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass(); // !!!
this.anInstance.doSomething();
}
}
// using "this.anInstance" instead of "anInstance" prevents another warning,
// Unqualified access to the field WeirdInnerClassJavaWarning.anInstance
Run Code Online (Sandbox Code Playgroud)
与!!!线!使用我的新警告设置在Eclipse中向我发出此警告:
对包含构造函数WeirdInnerClassJavaWarning.InnerClass()的访问由合成访问器方法模拟.提高其可见性将改善您的表现.
这是什么意思?当我将"私有静态类"更改为"受保护的静态类"时,警告就消失了,这对我来说毫无意义.
编辑:我终于找到了"正确"修复.这里真正的问题似乎是这个嵌套的私有静态类缺少一个公共构造函数.那一个调整删除了警告:
package com.example.bugs;
public class WeirdInnerClassJavaWarning {
private static class InnerClass
{
public void doSomething() {}
public InnerClass() {}
}
final private InnerClass anInstance;
{
this.anInstance = new InnerClass(); …Run Code Online (Sandbox Code Playgroud) 我正在查看从Java字节码获取的一些反汇编代码.我看到一些声明如下:
.method static synthetic access$0()Lcom/package/Sample;
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚什么synthetic或access$0意味.有人可以帮我理解这部分吗?
在Kotlin中,当我有一个非公共成员并且inline fun调用它时,有一个编译错误说:
错误:(22,25)Kotlin:Public-API内联函数无法访问中
private fun f(): Unit定义的非公共APIcom.example
我找到了几种在公共场所调用我的函数的方法inline fun,但这是最好的方法吗?
假设我有一个private fun f() { }.然后我找到的选项是:
fun f() { }
把它公之于众.这是基线解决方案,但如果其他解决方案具有重大缺点,则最终可能会出现这种情况.
@PublishedApi internal fun f() { }
在Kotlin 1.1-M04中引入,注释可以应用于内部成员,使其有效公开.我注意到的含义是任何库用户仍然可以从Java代码中调用它,这就是我不喜欢它.
@Suppress("NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") inline fun g() { f() }
在stdlib源中找到,这个注释似乎在应用于调用函数时抑制了错误.但它的局限性是什么?它只能用于inline功能吗?在某些情况下,最终的程序会失败吗?我尝试使用这个技巧从内联函数调用非内联函数,并且它有效,但它看起来很可疑.
@JvmSynthetic @PublishedApi internal fun f() { }
将第二个解决方案与字节码中的合成标志组合在一起.我不确定这是否正确用法@JvmSynthetic,但这似乎隐藏了Java代码的功能,这解决了问题@PublishedApi internal.
那么,哪种解决方案是从公共内联系统中调用非公共功能的最佳方式?我没有看到每个解决方案的缺点是什么?
在Eclipse下开发Java应用程序时,我收到了关于"通过合成方法访问的方法/值"的警告.解决方案只是将私有访问修饰符更改为默认级别.
这让我想知道:使用合成方法的惩罚是什么?有一些?我假设编译器/ Eclipse会引发警告,但它是如此相关的东西还是可以安全忽略的东西?
我没有在这里看到这些信息,所以我问.
我在eclipse中做了一些新的警告设置.有了这些新设置,我面临一个奇怪的警告.阅读后我知道它是什么,但找不到删除它的方法.
这是我的示例代码问题
public class Test {
private String testString;
public void performAction() {
new Thread( new Runnable() {
@Override
public void run() {
testString = "initialize"; // **
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
带**的行在eclipse中给我一个警告
Read access to enclosing field Test.testString is emulated by a synthetic accessor method.
Increasing its visibility will improve your performance.
Run Code Online (Sandbox Code Playgroud)
问题是,我不想更改访问修饰符testString.另外,不想为它创建一个getter.
应该做些什么改变?
More descriptive example
public class Synthetic
{
private JButton testButton;
public Synthetic()
{
testButton = new JButton("Run");
testButton.addActionListener(new ActionListener() {
public …Run Code Online (Sandbox Code Playgroud) 复制者:
enum IDs {
ID {
@Override
void getId() {
w(); // warning here
}
};
void getId() {}
private static void w() {}
}
Run Code Online (Sandbox Code Playgroud)
发出警告:
从类型ID访问封闭方法w()由合成访问器方法模拟
我理解合成方法是什么 - 我没有得到的是它们如何与枚举结合 - 我希望枚举实例具有我在枚举中定义的所有私有方法.实例是否真的是嵌套类?
我有以下代码:
public class SomeClass {
//InterfaceUpdateListener is an interface
private InterfaceUpdateListener listener = new InterfaceUpdateListener(){
public void onUpdate() {
SomeClass.this.someMethod(); //complier complains on this line of code
}
};
private void someMethod() {
//do something in here on an update event occuring
}
//other code to register the listener with another class...
}
Run Code Online (Sandbox Code Playgroud)
我在 Eclipse 中的编译器抱怨说
Access to enclosing method 'someMethod' from type SomeClass is emulated by a synthetic accessor method.
谁能准确解释一下
谢谢
java ×6
eclipse ×3
jvm ×2
bytecode ×1
disassembly ×1
enums ×1
inline ×1
kotlin ×1
nested-class ×1
performance ×1
public ×1