如果您不知道Project Lombok可以帮助解决Java的一些烦恼,例如生成带注释的getter和setter,甚至像使用@Data生成简单的JavaBean.它可以真正帮助我,特别是在50个不同的事件对象中,你有多达7个不同的字段需要构建和使用getter隐藏.我可以删除近千行代码.
但是,我担心从长远来看,这将是一个令人遗憾的决定.##Java Freenode当我提到它时,Flamewars会在频道中爆发,提供代码片段会让可能的帮助者感到困惑,人们会抱怨缺少JavaDoc,而且未来的委托人可能会将其全部删除.我真的很喜欢积极的,但我担心的是消极的.
那么:在任何项目中使用Lombok都是安全的吗?积极影响是否值得消极?
在尝试创建包级别的Javadoc注释时,首选方法是什么?你是做什么?
package-info.java
package.html的
对我来说,我一直使用Package.html.但我想知道它是否是正确的选择.
我试图在Android上使用自定义字体用于TextView,遵循此处的指南.使用相同的字体,相同的代码,相同的一切,我在adb logcat中得到这个:
W/dalvikvm( 317): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
E/AndroidRuntime( 317): FATAL EXCEPTION: main
E/AndroidRuntime( 317): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.evilx.quacklock/org.evilx.quacklock.MainActivity}: java.lang.RuntimeException: native typeface cannot be made
E/AndroidRuntime( 317): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime( 317): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime( 317): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime( 317): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime( 317): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 317): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 317): at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 317): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 317): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 317): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 317): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 317): at …Run Code Online (Sandbox Code Playgroud) 在我的Maven项目中,有一个模块(核心),它的类有一些资源.当在模块内部运行类时,它能够获得自己的资源.一切正常.
东西断裂的地方是依赖核心的另一个模块试图运行该类.Java正在寻找资源的文件夹是这个模块,而不是核心模块.所以课程失败了.
简而言之:如何访问依赖项的资源?
我试图通过在Core的JAR Manifest中声明来尝试这样做Class-Path: ..但是当列出可用的资源时JSHookLoader.class.getClassLoader().getResources("");(JSHookLoader在Core中,如果它意味着什么),我得到:
Resource: W:\programming\quackbot-hg\impl\target\classes
File rebel.xml
Resource: W:\programming\maven-repo\org\quackbot\core\3.5-SNAPSHOT
File core-3.5-SNAPSHOT.jar
File core-3.5-SNAPSHOT.pom
File maven-metadata-local.xml
File _maven.repositories
Run Code Online (Sandbox Code Playgroud)
这当然使事情复杂化,因为我期望JAR本身位于Classpath中,而不是JAR所在的目录
有什么建议?
回到这个项目,我仍然有这个问题.其他指南已经讨论过使用maven-assembly-plugin和远程资源插件,但这很麻烦,因为所有模块都必须包含怪物插件XML.
为什么我不简化问题:如何将依赖JAR添加到资源列表?
这应该很简单,但我该怎么做呢?我花了好几个小时试图想出一个简单干净的方法去做,但无济于事.
我最近发现了一种在Google Guava和Project Lombok中创建对象的新实例的有趣方法:隐藏静态创建方法背后的构造函数.这意味着new HashBiMap()你可以做而不是做HashBiMap.create().
我的问题是为什么?隐藏构造函数有什么好处?对我来说,我认为这样做绝对没有优势,它似乎打破了基本的对象创建原则.因为开始创建一个对象new Object(),而不是一些Object.createMe()方法.这几乎就像为创建方法创建一个方法.
你这样做会得到什么?
我最近在我的一个项目中转向了Java 7.我声称它可以在Java 1.5上运行,因为我在Java 6或7中没有依赖它.但是在今天编译时我注意到了这一点:
bootstrap class path not set in conjunction with -source 1.5
Run Code Online (Sandbox Code Playgroud)
谷歌发现这个警告的信息很少.这是否意味着您无法从Java 1.7编译为Java 1.5?
在我的项目中,有一个所有客户端类都扩展的公共基类.这有一个@Autowired字段,需要由Hibernate注入.这些都在另一个具有@Autowired基类集合的类中组合在一起.
为了减少客户端代码的样板,我试图让@Component继承.由于@Component默认情况下不这样做(显然它曾经用过),我创建了这个变通方法注释
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
@Inherited
public @interface InheritedComponent {
}
Run Code Online (Sandbox Code Playgroud)
...并用它注释基类.它不漂亮但我希望它会起作用.不幸的是它没有,这真让我感到困惑,因为@Inherited应该让它发挥作用
有没有其他方法可以继承@Component?或者我只是要说任何扩展基类的类都需要这个样板?
通常JavaPractices.com是一个好主意的好网站,但这个让我很烦恼:JavaBeans很糟糕.
本文引用了几个原因,主要是JavaBean这个术语的意思是"Java Bean是一个可重用的软件组件,可以在构建器工具中以可视方式进行操作".不是数据存储,违反了某些模式,而且更复杂.
现在我同意最后一个,但在我看来,列表中的JavaBeans比嵌套的地图更有意义.文章声称数据库映射框架应该调用构造函数,而不是set*方法,并且对象应该是不可变的.但是在我看来,在尝试构建对象时调用set*方法比阅读更容易new MappedObject("column1", "column2", "yet another column", "this is stupid");
除了数据库映射之外,我还使用JavaBean样式类进行其他操作,例如对于IRC bot,每个用户都有一个对象,可以使用各种内容进行更新.每次给出新信息时我都不想创建新对象,我想将其添加到现有对象中.
所以我的问题是:使用JavaBeans进行数据存储是一种不好的做法,应该避免,还是非常安全?
我正在尝试使用maven网站插件创建一个基本的maven网站.所以我把它添加到我的pom:
<reporting>
<plugins>
<!--JavaDoc setup-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.7</version>
<configuration>
<defaultAuthor>Leon Blakey</defaultAuthor>
<defaultVersion>${project.version}</defaultVersion>
<links>
<link>http://download.oracle.com/javase/6/docs/api</link>
</links>
</configuration>
</plugin>
</plugins>
</reporting>
Run Code Online (Sandbox Code Playgroud)
跑了 mvn site --errors
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building pircbotx 1.3-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-site-plugin:2.0.1:site (default-site) @ pircbotx ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.688s
[INFO] Finished at: Wed Jan 12 18:08:00 EST 2011
[INFO] Final Memory: 5M/13M
[INFO] ------------------------------------------------------------------------
W:\programming\pircbot-hg>
Run Code Online (Sandbox Code Playgroud)
嗯,奇怪的是没有输出.所以当我检查目标/网站时,它是空的.唯一的文件夹是images /,css …
请考虑以下示例:
public class Sandbox {
public interface Listener<T extends JComponent> {
public void onEvent(T event);
}
public interface AnotherInterface extends Listener<JPanel>, Listener<JLabel> {
}
}
Run Code Online (Sandbox Code Playgroud)
这失败,出现以下错误
/media/PQ-WDFILES/programming/Sandbox/src/Sandbox.java:20: Sandbox.Listener cannot be inherited with different arguments: <javax.swing.JPanel> and <javax.swing.JLabel>
public interface AnotherInterface extends Listener<JPanel>, Listener<JLabel> {
^
1 error
Run Code Online (Sandbox Code Playgroud)
为什么呢?生成的方法没有重叠.事实上,这基本上意味着
public interface AnotherInterface {
public void onEvent(JPanel event);
public void onEvent(JLabel event);
}
Run Code Online (Sandbox Code Playgroud)
那里没有重叠.那为什么失败了呢?
万一你想知道我在做什么,并有一个更好的解决方案:我有一堆事件和一个监听器接口,几乎完全像Listener上面的类.我想创建一个适配器和一个适配器接口,为此我需要使用特定事件扩展所有Listener接口.这可能吗?有一个更好的方法吗?