アリJAVA規程 - スレッドプールは、エグゼキューを作成することはできません

  1. タイムリーなクリーンアップコードセグメントは、もはや使用や設定情報れます。注:ごみのコードまたは構成時代遅れ、と断固としてクリーンアップの手順については、オーバー肥大化し、コードの重複を避けるために
    Positive example: For codes which are temporarily removed and likely to be reused, use /// to add a reasonable note.
     public static void hello() {
        /// Business is stopped temporarily by the owner.
        // Business business = new Business();
        // business.active();
        System.out.println("it's finished");
    }

     

  2. 中間感嘆符 - 変数のページに供給された背景には、感嘆符、$ {VAR}します!注:VAR = nullまたは存在しない場合は、$ {VAR}はページに直接表示されます
    <input type="text" name="email" value="$!email"/>
    <input type="text" name="email" value="$!{email}"/>

     

  3. 中括弧は、次の形式の使用を避け、でもコードの一行だけならば、do文/ため/しばらく場合/他/使用する必要があります(条件)文場合。
  4. ;サブリストのシナリオでは、元のリストの注目修飾の高度は、サブリストをトラバース追加、全てConcurrentModificationExceptionがプロデュース異常削除するつながる
    理由は、サブリストの追加、削除要素は、追加し、それに応じて削除すると、ソースから見ることができます。注意このリスト。しかし、逆に例外が存在します。このような設計は、Java、知られていない理由については。

     

    Negative example:                
       List<String> originList = new ArrayList<String>();
       originList.add("22");
       List<String> subList = originList.subList(0, 1);
       //warn
       originList.add("22"); 

     

  5. スイッチブロックで、またはプログラムがケースまで続く先の休憩/復帰など、または注釈で終了し、それぞれの場合に、スイッチブロック内で、デフォルトの文が含まれている必要がありますし、最後に配置しても、それにもかかわらずコードは何をしていません。

  6. 正規表現を使用する場合は、そのコンパイル済みの機能を有効に利用すること、効果的に定期的な試合のスピードを加速することができます。注:しない方法で定義されたインビボ:パターンのパターン= Pattern.compile(ルール);
    注:コード効率の考慮事項

     

    public class XxxClass {
        // Use precompile
        private static Pattern NUMBER_PATTERN = Pattern.compile("[0-9]+");
        public Pattern getNumberPattern() {
            // Avoid use Pattern.compile in method body.
            Pattern localPattern = Pattern.compile("[0-9]+");
            return localPattern;
        }
    }

     

  7. タイマーは限り1がスローされた例外をキャッチしないように、複数のTimeTaskを実行する並列処理タイミングタスクを、マルチはスレッド場合は、他のタスクは自動的に終了します、使用ScheduledExecutorServiceは問題ではありません。
    注:並行して複数のタスクを処理する場合、所望であれば、スレッド例外が相互に影響を与えない、代わりScheduledExecutorServiceタイマを使用します

     

    //org.apache.commons.lang3.concurrent.BasicThreadFactory
    ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
            new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
    executorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            //do something
        }
    },initialDelay,period, TimeUnit.HOURS);

     

  8. など、DO / DTO / VO POJOクラスを定義する、任意の属性のデフォルト値を追加しないでください。(注:同じ株とパッケージの前面と)
  9. サービスとDAOのクラスについては、SOAの考え方に基づいて、サービス・インターフェース、接尾辞のImplはインタフェースの違いと内部実装クラス公開されている必要があり
    SOA:サービス指向アーキテクチャ(サービス指向アーキテクチャ)注
     
  10. 名前付き定数はすべて大文字である必要があり、単語と単語の間にアンダースコア、セマンティック整合性により分離し、長すぎない名前をクリアするために努力します
    public class ConstantNameDemo {
    
    /**
    * max stock count
    */
    public static final Long MAX_STOCK_COUNT = 50000L;
     

     

  11. 両端を使用して命名例外例外クラス
  12. ループ本体、StringBuilderのアペンド拡張メソッドを使用して文字列のカップリング。
  13. ThreadLocal変数は、後続のビジネスロジックと原因のメモリリークやその他の問題に影響を与える可能性があり、あなたはThreadLocal変数のカスタムをクリーンアップしていない場合は特に、スレッドプールのシーンでは、スレッドが頻繁に、再利用され、カスタムリサイクルする必要があります。try-finallyブロックのエージェントのメイク使用が回復しました。

  14. ラッパークラスのオブジェクト値の間のすべての比較、すべてのequalsメソッドを使用して比較しました。
    说明:对于Integer var=?在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,
    但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。
                
        Integer a = 235;
        Integer b = 235;
        if (a.equals(b)) {
            //相等
        }

     

  15. (インターフェイスメソッドを含む)すべての抽象メソッドは述べて戻り値、パラメータ、例外に加えて、どのような機能を実現するために、方法は何かをすることに留意しなければならない、Javadocコメントを使用する必要があります。注:実装と展開の考慮した場合、また説明してください。
    /**
         * fetch data by rule id
         * 
         * @param ruleId rule id
         * @param page page number
         * @param jsonContext json format context
         * @return Result<XxxxDO>
         */
        Result<XxxxDO> fetchDataByRuleId(Long ruleId, Integer page, String jsonContext);

     

  16. すべてのコメントは、各データ項目の目的を示す、タイプフィールドを列挙しなければなりません。
  17. すべてのクラスは、作成者情報を追加する必要があります。
  18. すべてのオーバーライドメソッドは、あなたが@Overrideコメントを追加する必要があります。(注:コンパイルエラーを事前に発見させることができます)
  19. すべてのプログラミング関連の名前は、アンダースコア、またはドル記号で始めることはできません
  20. 抽象クラス名または使用抽象基底の始まり
  21. 内部単一行コメントの方法は、//コメントを使用して、別の行に声明の上に注釈付き。/ * * /コメントを使用して内部複数行のコメント。コードが揃っていることに注意してください。
  22. メソッド名、パラメータ名、メンバ変数、ローカル変数は、一貫して使用lowerCamelCaseあるが、こぶの形を遵守しなければなりません
  23. もし乱数整数型を取得したい場合はMath.random()このメソッドは、double型、値[0の注目範囲を返し、1)(ゼロの値をとることができ、ゼロ例外が認め)、拡大していないX 10その後、数回ランダムnextLongオブジェクトを使用して、nextIntまたは直接法を丸めます。 
    Negative example:
        Long randomLong =(long) (Math.random() * 10);
    
            
    Positive example:
        Long randomLong = new Random().nextLong();
     
  24. テスト対象のクラスの名前にちなんで名付けられたテストクラスはテストを終了し始めて
  25. クラス、クラスのプロパティ、クラスメソッドは、javadocの仕様を使用して注釈を付けなければなりません、使用/ ** *内容/フォーマットは、// xxxのモードおよび/ * XXX * /方法を使用することはできません。

     

    
    说明:在IDE编辑窗口中,javadoc方式会提示相关注释,生成javadoc可以正确输出相应注释;在IDE中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。
        /**
         * 
         * XXX class function description.
         *
         */
        public class XxClass implements Serializable {
            private static final long serialVersionUID = 113323427779853001L;
            /**
             * id
             */
            private Long id;
            /**
             * title
             */
            private String title;
        
            /**
             * find by id
             * 
             * @param ruleId rule id
             * @param page start from 1
             * @return Result<Xxxx>
             */
            public Result<Xxxx> funcA(Long ruleId, Integer page) {
                return null;
            }
        }

     

  26. 使用UpperCamelCaseのスタイルクラス名)は、こぶの形を遵守しなければならないが、次の例外的な状況に関連:(ドメインモデルという名前のDO / BO / DTO / VO / DAO
  27. エグゼキュータ・スレッド・プールを作成することができますが、ThreadPoolExecutorの方法により、このアプローチは、学生が資源の枯渇の危険性を回避するために、より明示的な運用ルールのスレッドプールを作成することができますされていません。 
    说明:Executors各个方法的弊端:
    1)newFixedThreadPool和newSingleThreadExecutor:
      主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
    2)newCachedThreadPool和newScheduledThreadPool:
      主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。
                
    Positive example 1:
        //org.apache.commons.lang3.concurrent.BasicThreadFactory
        ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
            new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
           
            
                
    Positive example 2:
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
            .setNameFormat("demo-pool-%d").build();
    
        //Common Thread Pool
        ExecutorService pool = new ThreadPoolExecutor(5, 200,
             0L, TimeUnit.MILLISECONDS,
             new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
    
        pool.execute(()-> System.out.println(Thread.currentThread().getName()));
        pool.shutdown();//gracefully shutdown
           
            
                
    Positive example 3:
        <bean id="userThreadPool"
            class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
            <property name="corePoolSize" value="10" />
            <property name="maxPoolSize" value="100" />
            <property name="queueCapacity" value="2000" />
    
        <property name="threadFactory" value= threadFactory />
            <property name="rejectedExecutionHandler">
                <ref local="rejectedExecutionHandler" />
            </property>
        </bean>
        //in code
        userThreadPool.execute(thread);

     

  28. ミリ秒単位の現在の数を取得します:のSystem.currentTimeMillis();代わりに新しいDate()getTime(); 。
    注:これは、効率の考慮事項である、DATは発生せず、冗長オブジェクト
  29. 说明:如果想获取更加精确的纳秒级时间值,用System.nanoTime。在JDK8中,针对统计时间等场景,推荐使用Instant类。
        public class TimeMillisDemo {
            public static void main(String args[]) {
                // Positive example:
                long a = System.currentTimeMillis();
                // Negative example:
                long b = new Date().getTime();
        
                System.out.println(a);
                System.out.println(b);
            }
        }
     

    基本データ型の戻り型は、オブジェクトが戻りデータ・タイプをパッケージ化されて、自動的にアンパックNPEが生成されてもよいです

    public int method() {
            Integer a = null;
            return a;
        }

     

  30. ランダムなインスタンスを避けることは、インスタンスを共有することはスレッドセーフではあるが、複数のスレッドを使用して、同じシード性能劣化のために、競合によるものです。説明:ランダムインスタンスjava.util.RandomのまたはMath.random()方法を含みます。
    说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
                
        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
        .setNameFormat("demo-pool-%d").build();
        ExecutorService singleThreadPool = new ThreadPoolExecutor(1, 1,
        0L, TimeUnit.MILLISECONDS,
        new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
    
        singleThreadPool.execute(()-> System.out.println(Thread.currentThread().getName()));
        singleThreadPool.shutdown();
         
  31. 避けコピーは、Apache々BeanUtilsを使って属性。

    说明:Apache BeanUtils性能较差,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier。
        TestObject a = new TestObject();
        TestObject b = new TestObject();
        a.setX(b.getX());
        a.setY(b.getY());

     

  32. 参照することにより、オブジェクトのクラスへのクラス名に直接アクセスして、不要な分析コストコンパイラを高め、アクセスに、このような静的変数や静的メソッドを避けてください。(注:メカニズムJVMを理解する必要があります)
  33. 等、一般的な方法に加えて、(例えば、のgetXXX / isXxx)、条件が複雑な文を実行しないと判定され、複雑なロジックの結果を読みやすくするために、意味のあるブール変数に割り当てられているかを判断します。
    说明:很多if语句内的逻辑相当复杂,阅读者需要分析条件表达式的最终结果,才能明确什么样的条件执行什么样的语句,那么,如果阅读者分析逻辑表达式错误呢?
                
    Negative example:
        if ((file.open(fileName, "w") != null) && (...) || (...)) {
            ...
        }
                
            
                
    Positive example:
        boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
        if (existed) {
            ...
        }
     
  34. 初期化の際に設定、指定されたセットのサイズの初期値。
    说明:HashMap使用如下构造方法进行初始化,如果暂时无法确定集合大小,那么指定默认值(16)即可。
             
     Negative example:   
       Map<String, String> map = new HashMap<String, String>();
        
            
     Positive example: 
       Map<String, String> map = new HashMap<String, String>(16);
     
リリース9件のオリジナルの記事 ウォンの賞賛4 ビュー10000 +

おすすめ

転載: blog.csdn.net/juan190755422/article/details/85340457