小编Dav*_*ton的帖子

应该将一组常量放在类或接口中吗?

如果我有一组静态常量,我想集中声明这些静态常量,以便它们可以在各种项目中共享,如果它们放在类或接口(Java)中.

在过去,我已经看到它们主要放在一个类中,但我开始认为,因为类不会也不应该被实例化,也许它们在接口中会更好,但是接口不应该被任何类实现,例如

public class ErrorCodes {
    public static final String ERROR_1 = "-1";
    public static final String ERROR_2 = "-2";
}
Run Code Online (Sandbox Code Playgroud)

要么

public interface ErrorCodes {
    public static final String ERROR_1 = "-1";
    public static final String ERROR_2 = "-2";
}
Run Code Online (Sandbox Code Playgroud)

java standards coding-style

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

忽略重音的Java字符串搜索

我正在尝试为我的应用程序编写一个过滤器函数,该函数将采用输入字符串并以某种方式过滤掉与给定输入不匹配的所有对象.最简单的方法是使用String的contains方法,即只检查对象(对象中的String变量)是否包含过滤器中指定的字符串,但这不会考虑重音.

有问题的对象基本上是Persons,我想要匹配的字符串是名称.因此,例如,如果有人搜索Joao,我会期望Joáo被包含在结果集中.我已经在我的应用程序中使用了Collat​​or类来按名称排序,它运行良好,因为它可以进行比较,即使用英国语言​​环境á来自b之前但是之后.但是,如果你比较a和á因为它们不相等,它显然不会返回0.

那么有谁知道我怎么能这样做?

java string localization diacritics filter

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

将1周添加到日期,哪种方式首选?

我正在审查工作中的一些代码,并且遇到了代码处理如何处理当前时间1周的不一致问题,并且想知道是否有任何理由为什么一个人应该优先于另一个:

第一个是实用方法:

public static Date addDaysToDate(final Date date, int noOfDays) {
    Date newDate = new Date(date.getTime());

    GregorianCalendar calendar = new GregorianCalendar();
    calendar.setTime(newDate);
    calendar.add(Calendar.DATE, noOfDays);
    newDate.setTime(calendar.getTime().getTime());

    return newDate;
}
Run Code Online (Sandbox Code Playgroud)

第二个使用简单的毫秒运算:

long theFuture = System.currentTimeMillis() + (86400 * 7 * 1000);
Date nextWeek = new Date(theFuture);
Run Code Online (Sandbox Code Playgroud)

第二种方法显然使用"幻数"来定义一周,但是这可以移动到一个常数.MILLISECONDS_IN_ONE_WEEK = 86400 * 7 * 1000 除此之外,是否有任何理由为什么这些方法中的一种应该优先于另一种呢?

基本上我想改变代码在整个过程中保持一致,但我不完全确定删除哪一个.所以任何论据都是有用的.

java datetime calendar date

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

Git:仅合并在分支上进行的更改

  G---H             // Release Branch
 /
/
A---B---E---F---    // master
    \
     \
      C---D---     // bug fix branch
Run Code Online (Sandbox Code Playgroud)

根据我们对项目的特殊需求,上述情况很常见.我们的master/dev分支有一些提交.然后我们得到一个错误报告并开始修复bug分支(上面提交C和D).在此期间,dev分支中会发生更多提交.接下来我们被告知我们需要为客户创建一个版本,该版本不能包含上面提交的B,E和F引入的更改,但它应该包括错误修复.

所以我们在更改B之前应用了dev,但是将错误修复到这个版本分支的最佳方法是什么?如果我执行分支的合并,它将包括在B中做出的我不想要的更改.我可以执行提交C和D的樱桃选择,但我读到基于这个答案的樱桃采摘并不总是一个好主意,因为我的回购将会是这样的:

  G---H---C'---D'--- // Release Branch
 /
/
A---B---E---F---     // master
    \
     \
      C---D---       // bug fix branch
Run Code Online (Sandbox Code Playgroud)

因此C'和D'显示为具有不同sha-1 ID的全新提交,如C和D.这真的是一件坏事吗?这会导致什么问题?有没有更好的方法将错误修复分支的更改发送到发布分支?

git version-control merge branch git-branch

20
推荐指数
2
解决办法
9035
查看次数

Android Fragments应该重用1个片段还是创建新实例?

我正在尝试学习Android中的片段,并且从我发现的各种示例中似乎有不同的方法,我只是想得到一些关于哪种方法是正确的建议,或者至少在哪种情况下应该是一种方式用在另一个上面.

一个示例创建了一个包含片段和FrameLayout的布局.在代码中,当从ListFragment中选择一个项目时,会创建一个新的Fragment(在构造函数中需要一些数据),并使用这个新的Fragment替换FrameLayout(使用FragmentTransaction.replace()).

另一个例子有一个布局文件,它并排声明了2个片段.现在在代码中,当用户从一个片段中的列表中选择项目时,调用另一个片段来更新数据(基于所选项目).

所以我只是想知道这些方法中的任何一种是否比其他方法更受欢迎,或者是否存在应该使用某种方法的情况?

编辑:这是我所指的两种方法中的每一种的代码:

1:

        mCurCheckPosition = index;

        if (mDualPane) {
            // We can display everything in-place with fragments, so update
            // the list to highlight the selected item and show the data.
            getListView().setItemChecked(index, true);

            // Check what fragment is currently shown, replace if needed.
            DetailsFragment details = (DetailsFragment)
                    getFragmentManager().findFragmentById(R.id.details);
            if (details == null || details.getShownIndex() != index) {
                // Make new fragment to show this selection.
                details = DetailsFragment.newInstance(index);

                // Execute a transaction, replacing any existing fragment
                // …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-fragments

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

在Java中分配大量数组时,避免内存碎片

我正在开发一个在Windows Mobile设备上运行的Java应用程序.为了实现这一目标,我们一直在使用Esmertec JBed JVM,这并不完美,但我们现在仍然坚持使用它.最近我们收到客户关于OutOfMemoryErrors的投诉.在经历了很多事情后,我发现设备有足够的可用内存(大约4MB).

OutOfMemoryErrors总是出现在代码中的同一点,也就是扩展StringBuffer以便向其附加一些字符时.在这个区域添加了一些日志记录后,我发现我的StringBuffer中有大约290000个字符,容量大约是290500.内部字符数组的扩展策略只是将大小加倍,所以它会尝试分配一个数组大约580000个字符.我打印出这段时间的内存使用量,发现它总共使用了大约3.8MB的大约6.8MB(尽管我已经看到总可用内存有时会增加到12MB左右,因此有足够的扩展空间).所以在这一点上,应用程序报告了一个OutOfMemoryError,考虑到仍然有多少,它没有多大意义.

到目前为止,我开始考虑应用程序的运行.基本上发生的事情是我正在使用MinML(一个小的XML Sax Parser)解析XML文件.XML中的一个字段中包含大约300k个字符.解析器从磁盘流式传输数据,默认情况下,它一次只加载256个字符.因此,当它到达相关字段时,解析器将调用处理程序的'characters()'方法超过1000次.每次创建一个包含256个字符的新char [].处理程序只是将这些字符附加到StringBuffer.StringBuffer的默认初始大小只有12,因此当字符附加到缓冲区时,它将不得不增长很多次(每次创建一个新的char []).

我的假设是,虽然有足够的可用内存,因为前面的char []可以被垃圾收集,但是可能没有足够大的连续内存块来适应我想要分配的新数组.也许JVM不够智能,无法扩展堆大小,因为它很愚蠢,认为没有必要,因为显然有足够的可用内存.

所以我的问题是:有没有人有这个JVM的经验,并且可能最终确认或反驳我对内存分配的假设?而且,有没有人有任何想法(假设我的假设是正确的)关于如何改进数组的分配,以便内存不会碎片化?

注意:我已经尝试过的事情:

  • 我增加了StringBuffer的初始数组大小,并且增加了解析器的读取大小,因此不需要创建这么多数组.
  • 我改变了StringBuffer的扩展策略,一旦达到一定的大小阈值,它只会扩展25%而不是100%.

做这两件事有点帮助,但随着我增加xml数据的大小,我仍然得到相当低的大小(约350kb)的OutOfMemoryErrors.

另外要添加的内容:所有这些测试都是在使用相关JVM的设备上执行的.如果我使用Java SE 1.2 JVM在桌面上运行相同的代码我没有任何问题,或者至少我没有遇到问题,直到我的数据大小达到4MB.

编辑:

我刚试过的另一件事有点帮助我将Xms设置为10M.因此,这可以解决JVM在不应该扩展堆时的问题,并允许我在错误发生之前处理更多数据.

java memory jvm memory-management windows-mobile

13
推荐指数
1
解决办法
2944
查看次数

Eclipse插件:如何获取当前所选项目的路径

我正在编写一个Eclipse插件,它将在Java项目的上下文菜单中显示一个菜单项.我编写了plugin.xml,如下所示:

<plugin>
   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            locationURI="popup:org.eclipse.jdt.ui.PackageExplorer">
         <dynamic
               class="uk.co.dajohnston.plugin.classpathswitcher.menu.MenuContribution"
               id="uk.co.dajohnston.plugin.classpathSwitcher.switchMenuContribution">
            <visibleWhen>
               <with
                     variable="activeMenuSelection">
                  <iterate>
                     <adapt
                           type="org.eclipse.jdt.core.IJavaProject">
                     </adapt>
                  </iterate>
                  <count
                        value="1">
                  </count>
               </with>
            </visibleWhen>
         </dynamic>
      </menuContribution>
   </extension>

</plugin>
Run Code Online (Sandbox Code Playgroud)

所以我现在正在尝试编写MenuContribution扩展的类,CompoundContributionItem这样我就可以创建一个动态菜单,这个菜单的内容将基于Java Project的根目录中存在的一组文件.但是我试图从getContributionItems方法中获取根目录的路径.

基于plugin.xml文件,我可以保证仅在选择单个Java项目时才调用该方法,因此我需要做的就是获取当前选择,然后获取其绝对路径.有任何想法吗?或者有更好的方法吗?

java eclipse eclipse-pde eclipse-plugin

11
推荐指数
3
解决办法
2万
查看次数

Java将int隐式转换为byte

我即将开始处理需要读取字节和创建字符串的事情.正在读取的字节表示UTF-16字符串.所以只是为了测试我想要将UTF-16编码的简单字节数组转换为字符串.数组中的前2个字节必须表示字节序,因此必须是0xff 0xfe或0xfe 0xff.所以我尝试按如下方式创建我的字节数组:

byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误,因为0xFF和0xFE太大而无法放入一个字节(因为字节是用Java签名的).更确切地说,错误是int无法转换为字节.我知道我可以使用强制转换显式地从int转换为byte并获得所需的结果,但这不是我的问题.

为了尝试一些东西,我创建了一个String并调用了getBytes("UTF-16")然后打印了数组中的每个字节.输出有点令人困惑,因为前两个字节是0xFFFFFFFE 0xFFFFFFFF,后跟0x00 0x52 0x00 0x6F.(显然这里的字节顺序与我上面尝试创建的不同,但这并不重要).

使用此输出我决定尝试以相同的方式创建我的字节数组:

byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它工作得很好.所以我的问题是,为什么Java允许0xFFFFFF80或更大的整数值自动转换为没有显式强制转换的字节,但任何等于或大于0x80的东西都需要显式强制转换?

java encoding byte casting utf-16

9
推荐指数
1
解决办法
4884
查看次数

我该如何在班上实现一个静态的字符串集合

我是C++的新手,所以这可能是一个容易回答的问题.我正在编写一个类(Person),当创建Person时,应该从预定义名称的集合中为其分配一个随机名称.所以在Person类中我想定义一些我可以随机访问的静态字符串集合,因此我还需要知道它有多少.

我也在这里使用Qt,所以解决方案最好是使用标准库或Qt库中的东西.

我来自Java背景和Java,我可能会做类似的事情:

private static final String[] NAMES = { "A", "B" };
Run Code Online (Sandbox Code Playgroud)

在这种情况下,相同的是什么?

c++ qt static constants

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

检查Subversion存储库时出错(svn:您的.svn/tmp目录可能丢失或损坏;)

我试图检查一个完整的subversion存储库,包括所有分支和标签:

svn co svn+ssh://path/to/project
Run Code Online (Sandbox Code Playgroud)

这运行了一段时间,但在检查分支时我收到以下错误:

svn: Your .svn/tmp directory may be missing or corrupt; run 'svn cleanup' and try again
svn: Can't open file 'project\branches\BRANCH\source\java\com\bS\.svn\tmp\text-base\Event.java.svn-base': The system cannot find the path specified.
Run Code Online (Sandbox Code Playgroud)

所以我尝试通过以下方式手动检查分支:

svn co svn+ssh://path/to/project/branches/BRANCH
Run Code Online (Sandbox Code Playgroud)

这运行罚款,我得到分支机构.然后,我可以将分支复制到完整项目的branches目录中并继续结帐.但它一直在其他分支上遇到这个问题.

有没有人知道为什么我不能将分支机构作为整个项目的一部分签出,但我可以自己检查一下吗?

svn version-control repository svn-checkout

8
推荐指数
2
解决办法
9882
查看次数