MOTIVATION
In einem YouTube-Video von Venkat Subramaniam erzählt er, wie man AutoCloseable nicht verwendet, sondern versucht, eine Funktion wie „use“ zu verwenden. Weil man möglicherweise vergisst, den Try-Block für eine Klasse zu implementieren, die AutoCloseable implementiert.
FRAGE
Ich habe diese Strategie bei vielen implementiert Es gibt jedoch einen Fall, den ich nicht bearbeiten konnte.
Ich habe viele Dateischreiber, je nach Dateityp. Alle verwenden dieselbe Schnittstelle. So kann der Hauptmakrocode analysiert und Dateiaktionen für alle Arten von Dateitypen verarbeitet werden. (Im Blog habe ich die Funktionsnamen auf nur „addText“ und die Dateitypen auf 2 reduziert: „FileWeb“ und „FileTable“.)
Und, Der Benutzer entscheidet jederzeit, welche Art von Dateien er verwenden möchte.
Die Reihenfolge der Vorgehensweise ist wie folgt. (Dort wird in der Funktion „constructFileAccordingToMacroCode“ „das zeilenweise Parsen des Makrocodes“ zweimal verarbeitet).
Die Art der parallelen Vorgehensweise ist wie folgt. (Dort wird die Funktion „constructFileAccordingToMacroCode“ einmal ausgeführt, daher wird „das zeilenweise Parsen des Makrocodes“ einmal verarbeitet).
Wenn ich es jedoch umsetze, verliere ich die Möglichkeit, die unerwünschten Dateitypen nicht zu erstellen.
Gibt es eine intelligentere Möglichkeit? Dinge tun?
RELEVANTE BEISPIELKLASSENDATEIEN[/b]
//WILL POSSIBLY CREATE OUT OF MEMORY ERROR
private static boolean constructFileAccordingToMacroCode(String macroCode, FileInterface... files) {
//parse macroCode line by line in a for loop {
var errorPresent = IntStream.range(0, files.length).parallel()
.mapToObj(i -> {
var file = files[i];
/*FOREXAMPLE LINE1: from macroCode*/
var result = file.addText("I am a %s type file.".formatted(file.getClass().getSimpleName()));
if (!result) {
return false;
}
/*FOREXAMPLE LINE2: from macroCode*/
file.addText(", and time is %L".formatted(System.currentTimeMillis()));
if (!result) {
return false;
}
return true;
})
.filter(result -> false)
.findAny().isPresent();
if (errorPresent) {
return false;
}
//}
return true;
}
[b]MOTIVATION[/b][b] In einem YouTube-Video von Venkat Subramaniam erzählt er, wie man AutoCloseable nicht verwendet, sondern versucht, eine Funktion wie „use“ zu verwenden. Weil man möglicherweise vergisst, den Try-Block für eine Klasse zu implementieren, die AutoCloseable implementiert. FRAGE[/b][b] Ich habe diese Strategie bei vielen implementiert Es gibt jedoch einen Fall, den ich nicht bearbeiten konnte.
Ich habe viele Dateischreiber, je nach Dateityp. Alle verwenden dieselbe Schnittstelle. So kann der Hauptmakrocode analysiert und Dateiaktionen für alle Arten von Dateitypen verarbeitet werden. (Im Blog habe ich die Funktionsnamen auf nur „addText“ und die Dateitypen auf 2 reduziert: „FileWeb“ und „FileTable“.)
Und, Der Benutzer entscheidet jederzeit, welche Art von Dateien er verwenden möchte.
Die Reihenfolge der Vorgehensweise ist wie folgt. (Dort wird in der Funktion „constructFileAccordingToMacroCode“ „das zeilenweise Parsen des Makrocodes“ zweimal verarbeitet). [code]{//SEQUENTIAL boolean produceFileTable = true; if (produceFileTable) { FileTable.use(dir, fileLabel, fileTable -> { constructFileAccordingToMacroCode(macroCode, fileTable); }); }
boolean produceFileWeb = true; if (produceFileWeb) { FileWeb.use(dir, fileLabel, fileWeb -> { constructFileAccordingToMacroCode(macroCode, fileWeb); }); } } [/code] Die Art der parallelen Vorgehensweise ist wie folgt. (Dort wird die Funktion „constructFileAccordingToMacroCode“ einmal ausgeführt, daher wird „das zeilenweise Parsen des Makrocodes“ einmal verarbeitet). [code]{//KIND OF PARALLEL boolean produceFileTable = true;//? boolean produceFileWeb = true;//? FileTable.use(dir, fileLabel, fileTable -> { FileWeb.use(dir, fileLabel, fileWeb -> { constructFileAccordingToMacroCode(macroCode, fileTable, fileWeb); }); }); } [/code] Wenn ich es jedoch umsetze, verliere ich die Möglichkeit, die unerwünschten Dateitypen nicht zu erstellen. Gibt es eine intelligentere Möglichkeit? Dinge tun? RELEVANTE BEISPIELKLASSENDATEIEN[/b] [b]
Haupt[/b][b] [code]public class Main { public static void main(String... s) { var macroCode = """ LINE1: ADD_FILE_TYPE LINE2: ADD_SYSTEM_MILLIS """; var dir = Path.of("c:\\fileFirectory"); var fileLabel = "fileLabel";
private static boolean constructFileAccordingToMacroCode(String macroCode, FileInterface... files) { boolean result; for (var file : files) { //parse macroCode line by line in a for loop { /*FOREXAMPLE LINE1: from macroCode*/ result = file.addText("I am a %s type file.".formatted(file.getClass().getSimpleName())); if (!result) { return false; } /*FOREXAMPLE LINE2: from macroCode*/ file.addText(", and time is %L".formatted(System.currentTimeMillis())); if (!result) { return false; } //} } return true; } } [/code]
FileTable [/b][b] [code]public class FileTable implements FileInterface {
private FileTable(Path dir) { this.dir = dir; } final public Path dir;
@Override public boolean addText(CharSequence text) { //TODO add text code return true; }
public static void use(Path dir, String fileLabel, TGS_RunnableType1 fileTable) { var instance = new FileTable(dir); try { instance.open(); fileTable.run(instance); instance.close(); } catch (Exception e) {//SILENTLY CLOSE try { instance.close(); } catch (Exception e2) { if (e2 instanceof InterruptedException) {//let InterruptedException propagate throw e2; } } if (e instanceof InterruptedException) {//let InterruptedException propagate throw e; } } }
private void open() { //open according to dir & fileLabel & type }
private void close() { //close according to dir & fileLabel & type } } [/code]
FileWeb [/b][b] [code]public class FileWeb implements FileInterface {
private FileWeb(Path dir) { this.dir = dir; } final public Path dir;
@Override public boolean addText(CharSequence text) { //TODO add text code return true; }
public static void use(Path dir, String fileLabel, TGS_RunnableType1 fileWeb) { var instance = new FileWeb(dir); try { instance.open(); fileWeb.run(instance); instance.close(); } catch (Exception e) {//SILENTLY CLOSE try { instance.close(); } catch (Exception e2) { if (e2 instanceof InterruptedException) {//let InterruptedException propagate throw e2; } } if (e instanceof InterruptedException) {//let InterruptedException propagate throw e; } } }
private void open() { //open according to dir & fileLabel & type }
private void close() { //close according to dir & fileLabel & type } [/code]
------- ---- UPDATE - [/b][b] PARALLELVERSION VON constructionFileAccordingToMacroCode[/b] [code] //WILL POSSIBLY CREATE OUT OF MEMORY ERROR private static boolean constructFileAccordingToMacroCode(String macroCode, FileInterface... files) { //parse macroCode line by line in a for loop { var errorPresent = IntStream.range(0, files.length).parallel() .mapToObj(i -> { var file = files[i]; /*FOREXAMPLE LINE1: from macroCode*/ var result = file.addText("I am a %s type file.".formatted(file.getClass().getSimpleName())); if (!result) { return false; } /*FOREXAMPLE LINE2: from macroCode*/ file.addText(", and time is %L".formatted(System.currentTimeMillis())); if (!result) { return false; } return true; }) .filter(result -> false) .findAny().isPresent(); if (errorPresent) { return false; } //} return true; } [/code]
Ich habe ~ 10000 Objekte vom Typ System.text.json.jsondocument. Für jedes parallele JSondocument muss ich die folgenden Schritte in der Reihenfolge ausführen. /> Speichern Sie den konvertierten...
Ich brauche bitte Rat. Ich arbeite an einem konditionierten Wartungsschulprojekt für Meeresmotoren mit KI- und ML -Techniken. Die Daten, die ich habe, enthält sowohl normale als auch fehlerhafte...
Ich habe es geschafft, ein Docker -Image für eine einfache Hello World Java -Konsolenanwendung einzurichten und auszuführen, aber ich kämpfe damit, wenn ich Pakete hinzufüge.
Ich habe das...
Ich habe eine Liste von Aufgaben der Größe n und die zur Verarbeitung benötigte Zeit wird als Aufgaben dargestellt, wobei i der Index für die Aufgabe ist.
Verarbeitungsschritt: Diese Aufgaben...
Ich habe eine Reihe von Aufgaben, die identische Jobs ausführen, aber verschiedene Parameter auf verschiedenen Servern verwenden. Es könnte auftreten, dass einer der Server nicht mehr...