RFR: 8314070: javax.print: Support IPP output-bin attribute extension [v7]

Phil Race prr at openjdk.org
Sat May 11 18:19:05 UTC 2024


On Sat, 11 May 2024 17:37:08 GMT, Alexander Scherbatiy <alexsch at openjdk.org> wrote:

>> @AlexanderScherbatiy did you see the comment in the CSR about sealed classes ?
>> I had originally suggested in this PR (search for a comment from a while ago) and I don't know if you saw it there either.
>
> @prrace 
> 
> I have updated the fix to make the `OutputBin` class sealed and `CustomOutputBin` class final.
> The `OutputBin` class permits internal `sun.print.CustomOutputBin` class.
> The `OutputBin` javadoc that `Implementation- or site-defined names for an output bin kind attribute may also be created by defining a subclass of class {@code OutputBin}.` is removed.
> If it is an applicable change I will update the CSR as well.

> > @AlexanderScherbatiy did you see the comment in the CSR about sealed classes ?
> > I had originally suggested in this PR (search for a comment from a while ago) and I don't know if you saw it there either.
> 
> @prrace There are two things which are not clear for me.
> 
> The first one is that a user can extend `OutputBin` class and provide its own implementation. Should it be possible to the user provide output bins other than supported ones?
> 
> The another question relates to `CustomOutputBin` class which is used to provide a list of supported output bins and which is not public. To make `OutputBin` class sealed it needs to add `CustomOutputBin` class to `OutputBin` class permits list:
> 
> ```
> public sealed class OutputBin extends EnumSyntax implements PrintRequestAttribute, PrintJobAttribute 
>     permits sun.print.CustomOutputBin {
> }
> 
> public final class CustomOutputBin extends OutputBin {
> }
> ```
> 
> Is it good to use a non public class in the public class permits list?
> 
> I made docs for the jdk with sealed `OutputBin` class. It has the `sealed` keyword in the javadoc but mentions nothing about internal `CustomOutputBin` class. `images/docs/api/java.desktop/javax/print/attribute/standard/OutputBin.html`:
> 
> ```
> public sealed class OutputBin
> extends EnumSyntax 
> implements PrintRequestAttribute, PrintJobAttribute
> ```

javadoc knows to not list the permitted class unless it is exported as public API, so it is fine.
"Users" should not need to to sub-class OutputBin, the JDK implementation will do this when it finds a printer. If we ever find a use-case that really demands it, the class can be unsealed.

"sealing" is like "final" in this regard. You can remove it, but typically you can't add it later.

I wish we'd had sealing 20 years ago ..

-------------

PR Comment: https://git.openjdk.org/jdk/pull/16166#issuecomment-2105980495


More information about the client-libs-dev mailing list