我一直在浏览所有StackOverflow中有关Java资本化问题的大量问题,而且他们似乎都不关心国际化,事实上似乎没有一个在国际背景下工作.所以这是我的问题.
我在Java中有一个String,它代表一个单词 - 所有isLetter()字符,没有空格.我想让第一个字符大写,其余小写.我确实有我的单词的语言环境.
为字符串的最后一部分调用.substring(1).toLowerCase(Locale)很容易.但我不知道如何获得正确的第一个角色.
我遇到的第一个问题是荷兰语,其中"ij"作为有向图应该一起大写.我可以手工处理这个问题,因为我了解它; 现在可能还有其他语言有这种我不知道的东西,我相信Unicode会告诉我,如果我问得好.但我不知道该怎么问.
即使上面的问题得到解决,我仍然没有办法处理英语,土耳其语和希腊语,因为Character支持titlecase但没有语言环境,而String支持语言环境但不支持标题.
如果我接受代码点,并将其传递给Character.toTitleCase(),则会失败,因为无法将语言环境传递给此方法.因此,如果系统区域设置是英语但是单词是土耳其语,并且单词的第一个字符是"i",我将得到"I"而不是"İ",这是错误的.现在,如果我使用子字符串并使用.toUpperCase(Locale),这将失败,因为它是高位而不是标题大小写.因此,如果这个词是希腊语,我仍然会得到错误的字符.
如果有人有有用的指示,我会很高兴听到他们.
假设我有一个静态复杂对象,它由一个线程池定期更新,并在一个长时间运行的线程中或多或少地连续读取.对象本身总是不可变的,反映了最近的某种状态.
class Foo() { int a, b; }
static Foo theFoo;
void updateFoo(int newA, int newB) {
f = new Foo();
f.a = newA;
f.b = newB;
// HERE
theFoo = f;
}
void readFoo() {
Foo f = theFoo;
// use f...
}
Run Code Online (Sandbox Code Playgroud)
我至少不在乎我的读者是看到旧的还是新的Foo,但是我需要看到一个完全初始化的对象.IIUC,Java规范说没有HERE中的内存屏障,我可能会看到一个fb初始化但尚未提交到内存的对象.我的程序是一个真实世界的程序,它迟早会将内容提交到内存中,所以我不需要立即将新的值ofFoo提交到内存中(虽然它不会受到伤害).
您认为实现内存屏障最可读的方式是什么?如果需要,我愿意为了可读性而付出一点性能价格.我想我可以将赋值同步到Foo,这样可行,但是我不确定读取代码的人为什么这么做是非常明显的.我还可以同步新Foo的整个初始化,但这会引入更多实际需要的锁定.
你会如何编写它以使其尽可能可读?
对Scala版本的奖励荣誉:)
我有一个用于编译我的scala项目的ant文件.我正在使用fsc来创建奇迹以避免我的核心2需要加载编译器的2~3秒.
我的问题是:据fsc我所知,蚂蚁任务会造成相同的2~3秒的惩罚.这很烦人,因为有这个原因的fsc.它更加烦人,因为它真的是开始时间而不是处理时间,所以即使没有任何重新编译的东西,我也要在fsc任务上等待3秒钟.它每次都变得更加恶化.
我的调查似乎表明,大部分时间花在阅读scala-compiler.jar上.实际上,因为它们直接运行编译器,所以它scalac和fsc任务需要它是有道理的.此外,从ant任务的类路径中删除scala-compiler.jar会导致任务因缺少依赖而失败.
从逻辑上讲,fsc任务只是连接到我想的编译守护程序,所以它不应该需要那个依赖项,但我想它是关于它是如何实现的(fsc任务继承自scala任务).也许它会出现在下一个版本中.
我现在正在研究的解决方案是,将我的fsc任务重写为应用任务并手动调用fsc.那时我不会有延迟.很遗憾,必须手动重做scala中包含的任务专门编写的工作.
有没有人有这个问题的经验?我的分析有什么不对吗?您能否提出比我计划实施的解决方案更好的解决方案?
作为参考,这是我的任务看起来像(是的,它编译一个Android项目):
<target name="compile-scala" description="Compile scala files">
<taskdef resource="scala/tools/ant/antlib.xml" classpath="${scala-library.jar}:${scala-compiler.jar}" />
<mkdir dir="${out.classes.absolute.dir}" />
<fsc encoding="utf-8" deprecation="on" destdir="${out.classes.absolute.dir}">
<src>
<dirset dir="." includes="src"/>
<dirset dir="." includes="gen"/>
</src>
<classpath>
<pathelement location="${android.jar}" />
<fileset dir="${sdk.dir}/tools/lib" includes="*.jar" />
</classpath>
</fsc>
</target>
Run Code Online (Sandbox Code Playgroud)
编辑:这是应用的任务看起来像.它似乎工作.然而,这是非常不满意的,所以问题仍然存在.
<target name="fast-compile-scala"
description="Compile scala files without loading the compiler inside ant">
<mkdir dir="${out.classes.absolute.dir}" />
<apply executable="fsc" failonerror="true" parallel="true">
<arg value="-encoding" />
<arg value="utf-8" />
<arg value="-deprecation" />
<arg …Run Code Online (Sandbox Code Playgroud) 我想编写一个类型别名来缩短,修改和封装的Scala代码.假设我有一些集合,它具有作为地图列表的属性,其值是元组.我的类型会像List[Map[Int, (String, String)]]我的应用程序允许的那样编写类似的东西或更通用的东西.我可以想象有一个超级类型要求Seq[MapLike[Int, Any]]我或其他任何漂浮我的船,具体的子类更具体.
然后我想为这个长类型写一个别名.
class ConcreteClass {
type DataType = List[Map[Int, (String, String)]]
...
}
Run Code Online (Sandbox Code Playgroud)
然后我会愉快地使用ConcreteClass#DataType我可以拿一个,并使用它.
现在假设我添加了一个函数
def foo(a : DataType) { ... }
Run Code Online (Sandbox Code Playgroud)
我想从外面用空列表来调用它.我可以打电话foo(List()),但是当我想将我的基础类型更改为另一种类型时Seq,我将不得不回来更改此代码.此外,这个空列表不是非常明确的DataType.而伴侣对象没有相关的List方法,所以我不能打电话DataType(),或者DataType.empty.当我需要非空列表时,它会更加烦人,因为我必须写出这个长类型的重要部分.
有什么方法可以让Scala把我的类型理解为同样的东西,包括带有创建者方法的伴随对象,为了缩短代码和黑盒子呢?或者,为什么我不应该首先这样做?
可能的重复:
从历史堆栈中删除一个活动
假设我的堆栈上有三个活动,像这样 A ? 乙?C.
我想终止 B 并用活动 D 替换它,这样堆栈看起来像这样: A ? ? C.
预期效果是有一个“屏幕选择器”活动 C. 它在活动 B 的顶部打开,提供许多可供选择的内容,当用户单击其中一个时,它会关闭,显示所选屏幕。我可以使用 overridePendingTransition 取消打开动画,但这并不能帮助我通过关闭选择器界面来显示活动。
有没有办法在Android中做到这一点?
我一直在使用scala的lazy val习惯用法,我想在Java中实现类似的东西.我的主要问题是构造一些值我需要一些在对象构造时不知道的其他值,但我不希望以后能够改变它.原因是,我正在使用一个GUI库,它代表我实例化对象,并在创建我需要的所有东西时调用一个不同的方法,这就是我知道我需要的值.
以下是我尝试实现的属性:
*变量的不变性.
*在构造函数之外的其他一些方法中初始化.
我不认为这在Java中是可能的,因为只有final实现变量的不变性,final变量才能在构造函数之外初始化.
Java中最接近我想要达到的目标是什么?
我想知道更多关于控制每个Scala actor运行位置的程度.我恰好处于某种特殊情况:需要高反应性,代码的很大一部分是时间关键的,最糟糕的是,我在Android上.考虑到这一点,我的主要目标是:使代码尽可能简单易读.
理想情况下我希望实现的目标(其中一些听起来不合理/彻头彻尾的愚蠢,请阅读下面的理由)
- 我希望能够在某些特定的,总是相同的,任意的线程中响应某些消息,但我需要不要阻止它等待消息.
- 我希望在工作线程池中完成大部分处理,理想情况下,当Scala actor支持时自动调整大小,同时保证此处理永远不会发生在上面的任意线程上.
这些要求源于Android的必要性:Android框架使用特殊线程来触摸UI,如果您从另一个线程触摸任何UI对象,您将获得异常.通过这种方式,它强制执行某种线程/锁定模型,这正是我正在努力解决的问题.但无论如何,这就是它的方式:我必须确保我的一些处理,即处理UI对象,正在这个线程上运行,而不是其他,因为框架恼人地说我应该怎么做.令人讨厌的副作用是,只要此线程处理我的代码,UI停止更新并且我的应用程序停止响应.所以我需要确保这个线程不会被随机选择,因为我可以在一些反应{}中运行长代码,
android框架提供了一个名为Handle的类,它实现了某种消息传递 - 你发送一个Runnable,它将在UI线程上运行.如果需要,我可以使用它.每次都会创建一个Runnable使代码混乱 - 可以做的一件事就是将它封装在某个方法中,以便我可以编写像
onUIThread {/*some code*/}
...比新的Runnable(){def run(){}}好得多.另一方面,这基本上就是onUIThread函数将要做的事情,所以我将创建两个闭包 - 然后我必须处理闭包的内存分配细节.我必须这样做,因为每次我分配一个对象时,GC都有机会在Android上运行,通常暂停执行150ms,这会破坏我的用户体验,如果它发生在一个关键的执行路径中.
所以最后:
- 我有没有办法静态地将一个actor与一个线程相关联,这样我就可以拥有一个UI actor,在其中反应{}并始终在UI线程上运行它的代码?/*我知道它本身就是糟糕的设计,请阅读上面的理由,看看为什么我无法帮助它*/
- 我有什么方法可以确保这个特定的线程永远不会被考虑用于响应反应中的消息{ }? - 考虑到我的约束,我可以做些什么建议,以获得更好的代码易读性?
scala ×4
java ×3
android ×2
actor ×1
ant ×1
concurrency ×1
constructor ×1
immutability ×1
string ×1
type-alias ×1
unicode ×1