2016-12-25 10 views
0

別のクラスを作成して、異なる種類のファイルを読み込む必要があります。今プロジェクトはクライアント側に配備されています。新しいファイルをサポートする必要があります。新しいクラスを作成し、サービスクラスで変更して新たに追加したクラスの新しいオブジェクトを作成する必要があります。新しいタイプのクラスのための新しいクラスを書くことは問題ありません。しかし、毎回サービスクラスを変更したくありません。この種の問題に対する解決策はありますか?前もって感謝します。実行時にJavaで新しく追加されたクラスのインスタンスを作成する方法

アップデート1:ここでは、サービスクラスのコード

@Service("StockistServiceImpl") 
public class StockistServiceImpl implements StockistService { 

@Override 
@Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class) 
public JSONArray saveStockistOrder(Integer stockistId, 
     MultipartFile[] orderFile, String orderNumber, String orderDate, 
     String partyCode,String order,Integer userId) 
{ 
          List<Pair<String, Integer>> charList = new ArrayList<Pair<String, Integer>>(); 
          Properties code1 = new Properties(); 
          try { 
           code.load(StockistServiceImpl.class.getClassLoader().getResourceAsStream("categoryOfFile.properties")); 
          } 
          catch (IOException e) { 
           //System.out.println("error in loading divisionNamePdfCode.properties"); 
           e.printStackTrace(); 
          } 
          String readDuelListedTxtFile = code.getProperty("readDuelListedTxtFile"); 
          String readStartLineLengthForOrderTxtFile = code.getProperty("readStartLineLengthForOrderTxtFile"); 
          String ReadFileWithNoStartLineTxtFile = code.getProperty("ReadFileWithNoStartLineTxtFile"); 
          String ReadStartLineLengthForQtySingleListTxtFile = code.getProperty("ReadStartLineLengthForQtySingleListTxtFile"); 

          if (readDuelListedTxtFile.contains(partyCode 
            .trim())) { 
           charList.addAll(dualListText 
              .readDuelListedTxtFile(
                fileName, codeDetails)); 
          } 
          else if (readStartLineLengthForOrderTxtFile.contains(partyCode 
            .trim())) { 
           charList.addAll(lineLength 
              .readStartLineLengthForOrderTxtFile(
                fileName, codeDetails)); 
          } 
          else if (ReadFileWithNoStartLineTxtFile.contains(partyCode 
            .trim())) { 
           T_FileWithNoStartLine noStartLine = new T_FileWithNoStartLine(); 
           charList.addAll(noStartLine 
              .readFileWithNoStartLineTxtFile(
                fileName, codeDetails)); 
          } 
          else if (ReadStartLineLengthForQtySingleListTxtFile.contains(partyCode 
            .trim())) { 
           T_StartLineLengthForQtySingleList noStartLine = new T_StartLineLengthForQtySingleList(); 
           charList.addAll(noStartLine 
              .readStartLineLengthForQtySingleListTxtFile(
                fileName, codeDetails)); 
          } 
} 

がアップデート2:ここで私たちは何が小売店のためのファイルの種類であることを知っているところから、プロパティファイルです。

#fileType,stockistCode 
fileType1=ST001,ST009 
fileType2=ST002,ST005,ST006 
fileType3=ST003,ST007 
fileType4=ST004,ST008 

は、私は新しいクラスが追加されている場合、我々は、サービスクラスを編集する必要はありませんので、クラス名とファイルタイプをマップするために、次のように新しいプロパティファイルを追加したいです。

#fileType,fullyqualifiedclassName 
fileType1=FullyQualifiedClassName1 
fileType2=FullyQualifiedclassName2 
fileType3=FullyQualifiedClassName3 
fileType4=FullyQualifiedclassName4 
+1

コードを追加して問題を説明できますか? – developer

+0

[ServiceLoader](http://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html)クラスを参照してください。 – Seelenvirtuose

答えて

1

ファイルリーダーオブジェクトの作成とサービスクラスを区切ります。

public class BuildFileReader() { 
    FileReader getReader(String xyz) { 
     FileReader reader; 

     ... 
     your logic 
     reader = new WhatEverReaderYouWant(); 
     ... 

     return reader; 
    } 
} 

サービスクラスは、単にFileReaderが使用するBuildFileReaderを要求し、もはや変更する必要はありません。

public class StockistServiceImpl { 
    ... 
    BuildFileReader bfr = new BuildFileReader(); 

    FileReader fileReader = bfr.getReader(xyz); 

    fileReader.readFile(fileName, codeDetails); 
    ... 
} 

クライアントごとに1種類のファイルリーダーが必要な場合は、クライアントごとにBuildFileReaderを構成できます。 クライアントごとに複数のタイプのファイルリーダーが必要な場合は、各タイプのインタフェースを定義します。BuildFileReaderで必要なタイプごとにgetReaderXYZ()関数を追加します。

0

最後に、いくつかのコードを変更して、ここにファイルのプロパティを持つクラス名をマッピングするためのプロパティファイルを追加した後は、コードと正常に動作します。

@Service("StockistServiceImpl") 
public class StockistServiceImpl implements StockistService { 

List<Pair<String, Integer>> charList = new ArrayList<Pair<String, Integer>>(); 


Map<String,String> mapTxtFile = new HashMap<String, String>(); 
          Properties fileTypeProperties = new Properties(); 
          Properties matchClassNameProperties = new Properties(); 
          try { 
           fileTypeProperties.load(StockistServiceImpl.class.getClassLoader().getResourceAsStream("fileTypeProperties.properties")); 
          } 
          catch (IOException e) { 

           //e.printStackTrace(); 
          } 
          try { 
           matchClassNameProperties.load(StockistServiceImpl.class.getClassLoader().getResourceAsStream("matchClassNameProperties.properties")); 
          } 
          catch (IOException e) { 

           //e.printStackTrace(); 
          } 

          for (String key : fileTypeProperties.stringPropertyNames()) { 
           String value = fileTypeProperties.getProperty(key); 
           mapTxtFile.put(key, value); 

           if(value.contains(partyCode.trim())){          
            String className = matchClassNameProperties.getProperty(key); 
            try { 
             Class clazz = Class.forName(className); 
             try { 
              TxtFile objToReadTxtFile = (TxtFile) clazz.newInstance(); 
              charList= objToReadTxtFile.readTxtFile(fileName, codeDetails); 

             } catch (InstantiationException e) { 
              // TODO Auto-generated catch block 
              e.printStackTrace(); 
             } catch (IllegalAccessException e) { 
              // TODO Auto-generated catch block 
              e.printStackTrace(); 
             } 

            } catch (ClassNotFoundException e) { 
             // TODO Auto-generated catch block 
             e.printStackTrace(); 
            } 
           }else{ 
            //read normally else block 

           } 
          } 


} 

今では私がreadTxtFileメソッドを持っているTXTファイルを読み込むためのインタフェースを作成し、そのためにfine.Butを進めています。それ以外のクラスはすべてこのインタフェースを実装します。

関連する問題