当仅使用一个资源时,Java 7 try-with-resources语法(也称为ARM块(自动资源管理))很好,简短而直接AutoCloseable.但是,当我需要声明彼此依赖的多个资源时,我不确定什么是正确的习惯用法,例如a FileWriter和a BufferedWriter包装它.当然,这个问题涉及AutoCloseable包装某些资源的任何情况,而不仅仅是这两个特定的类.
我提出了以下三种选择:
我见过的天真的习惯是只声明ARM管理变量中的顶级包装器:
static void printToFile1(String text, File file) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
bw.write(text);
} catch (IOException ex) {
// handle ex
}
}
Run Code Online (Sandbox Code Playgroud)
这很好而且简短,但它已被打破.由于底层FileWriter未在变量中声明,因此永远不会在生成的finally块中直接关闭它.它只能通过close包装方法关闭BufferedWriter.问题是,如果从bw构造函数抛出异常,close则不会调用它,因此底层FileWriter 将不会被关闭.
static void printToFile2(String text, File file) {
try (FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw)) {
bw.write(text); …Run Code Online (Sandbox Code Playgroud) 当我创建一个只有ListView的简单布局时,在最后一项之后没有显示分隔符,这看起来有点难看.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

但是,如果我在列表视图下添加另一个视图并设置listview的属性,我发现在最后一个项目后面会显示一个分隔符android:layout_above.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/bottom"
android:layout_alignParentTop="true" />
<TextView
android:id="@+id/bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@android:color/holo_blue_dark"
android:text="Bottom" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

为什么listview的行为如此?如何在仅包含列表视图的布局中的最后一项之后获取分隔符?
我有一个简单的AlertDialog显示一些项目的列表,单击其中一个项目后,单击的项目将传递回封闭项目Activity.我还想在用户取消对话框时使用后退按钮执行一些默认处理- 更具体地说,我想在这种情况下将空字符串传递给活动.
但是,如果我将对话框放在DialogFragment(来自兼容包)中,OnCancelListener 则在使用后退按钮关闭对话框时不会调用该对话框.我究竟做错了什么?
public class SelectItemDialog extends DialogFragment {
public interface Callback {
void onItemSelected(String string);
}
private static final String ARG_ITEMS = "items";
private Callback callback;
public static SelectItemDialog fromItems(Collection<String> items) {
SelectItemDialog fragment = new SelectItemDialog();
fragment.setArguments(newArguments(items));
return fragment;
}
private static Bundle newArguments(Collection<String> items) {
Bundle arguments = new Bundle();
arguments.putStringArray(ARG_ITEMS, items.toArray(new String[items.size()]));
return arguments;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
callback …Run Code Online (Sandbox Code Playgroud) 一些Android应用程序(尤其是Google的应用程序)的一个部分包含应用程序中使用的开源库列表,以及每个应用程序的许可证全文.这通常涉及Apache许可证,它在大多数常见的Android库中使用,例如ActionBarSherlock,ViewPagerIndicator,Guava等.
为了遵守(Apache)许可条款,是否必须包含此类归属?
这部分应该怎么样?如果多个库使用相同的许可证,是否有必要为每个库复制许可证的文本?
是否有必要包括许可证的全文,或者是否足够的唯一版权声明(参见附录:http://www.apache.org/licenses/LICENSE-2.0)?
官方的Android开发人员指南是否包含有关此主题的一些信息(我找不到任何信息)?
我如何使用NumberFormat格式化double给定的值Locale(默认语言环境就足够了)和给定的小数位数?
例如,我有以下值:
double d1 = 123456.78;
double d2 = 567890;
Run Code Online (Sandbox Code Playgroud)
我想以下列方式打印它们,例如使用美国语言环境和2个小数位:
123,456.78
567,890.00
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我实际上并不关心舍入模式,因为这些双值是从BigDecimal给定比例的a 获得的,因此它们的小数位数总是小于或等于我想要打印的小数位数.
编辑:
为了使事情更清楚,问题是我想以依赖于语言环境的方式显示钱,但是具有固定数量的小数位.上面的示例显示了如果系统区域设置是如何格式化值en_US.现在假设,系统区域设置是cs_CZ(捷克语),因此应以这种方式格式化相同的数字:
123 456,78
567 890,00
Run Code Online (Sandbox Code Playgroud)
现在,如何设置NumberFormat以始终显示2个小数位,但是根据当前区域设置显示千位分隔符和小数点?
当使用Theme.Sherlock.Light.DarkActionBar(或Theme.Holo.Light.DarkActionBar没有区别)时,例如在选择文本时出现的ActionMode(或"上下文ActionBar")默认情况下与标准黑暗主题中的样式相同,即带有光的深蓝色行动图标.
但是,当您尝试在对话框中选择文本时(在此主题中为浅色调,与黑色ActionBar形成对比),将显示与Light主题(白色背景)中样式相同的ActionMode.问题是,它的动作图标不是应该是暗的,而是亮的,使它们实际上不可见.

这看起来好像背景是从光主题中获取的(因为光对话框),但是图标是从黑暗主题中拍摄的.这是Light.DarkActionBar主题中的错误吗?我能为此做些什么吗?
使用Gradle构建Java或Groovy时,可以像这样定义源代码编码:
compileJava {
options.encoding = 'UTF-8'
}
compileTestJava {
options.encoding = 'UTF-8'
}
compileGroovy {
groovyOptions.encoding = 'UTF-8'
}
compileTestGroovy {
groovyOptions.encoding = 'UTF-8'
}
Run Code Online (Sandbox Code Playgroud)
但是,与Kotlin类似的方法不起作用:
compileKotlin {
kotlinOptions.jvmTarget = '1.8'
kotlinOptions.encoding = 'UTF-8'
}
Run Code Online (Sandbox Code Playgroud)
它失败并出现错误:
* What went wrong:
A problem occurred evaluating root project 'backend'.
> No such property: encoding for class: org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
Run Code Online (Sandbox Code Playgroud)
我实际上找不到任何关于Kotlin编译器编码的信息.这是否意味着没有这样的选择?它使用什么charset,UTF-8,系统默认(我希望不是)?
假设我有一个表示复数的简单接口,其实例将是不可变的.为了简便起见,我省略了明显的plus,minus,times和divide方法会简单地创建并返回一个新的不可变的实例.
public interface Complex {
double real();
double imaginary();
double absolute();
double angle();
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,将此实现为不可变类的最佳方法是什么?最简单直接的"我关心性能仅在问题出现时"的方法是将实部和虚部存储为最终字段,并计算每次调用这些方法时的绝对值和角度.这使得类变得小而简单,但显然最后两个方法每次都返回相同的结果.
public final class NonCachingComplex implements Complex {
private final double real;
private final double imaginary;
public NonCachingComplex(double real, double imaginary) {
this.real = real;
this.imaginary = imaginary;
}
@Override public double real() {
return real;
}
@Override public double imaginary() {
return imaginary;
}
@Override public double absolute() {
return Math.sqrt((real * real) + (imaginary * imaginary)); …Run Code Online (Sandbox Code Playgroud) 我刚刚将Eclipse IDE for Java Developers插件更新为版本1.5.1.20121004-1506,导致主工具栏中存在荒谬的空白:

是的,我知道将Eclipse更新为Indigo基本上是一个坏主意,因为每个新版本似乎越来越差,但除了重新安装一些旧版本之外,有没有任何简单的方法来解决这个问题(我真的不想丢失我的设置和安装插件)?这个bug是否在某处被追踪?
假设我有一个类,其中所有实例都被认为是相等的.典型的用例是针对没有任何状态但只表现为函数的类.
public class ToStringFunction implements Function<Object, String> {
@Override
public String apply(Object o) {
return o.toString();
}
@Override
public boolean equals(Object o) {
return o instanceof ToStringFunction;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,应该如何实现hashCode方法?当然,为了遵守equals/hashCode合约,它需要是一个常量值.但那应该是什么价值?如果使用诸如0或1之类的某些微不足道的值,则可能导致与其他类似类的冲突.
所以这似乎归结为这个问题:如何实现一个对于给定类可能是唯一的hashCode,但对于它的所有实例都是相同的.
我想出了这两个想法.你觉得怎么样,他们是否理智?
@Override
public int hashCode() {
return ToStringFunction.class.hashCode();
}
@Override
public int hashCode() {
return "ToStringFunction".hashCode();
}
Run Code Online (Sandbox Code Playgroud) java ×5
android ×4
caching ×1
eclipse-juno ×1
equality ×1
gradle ×1
hashcode ×1
immutability ×1
kotlin ×1
licensing ×1
open-source ×1